的根我有一个N叉树结构像什么在回答here解释:使用malloc
创建更改树和修剪
typedef struct node {
int ID;
struct node *child; // points to (first) child
struct node *next; // points to next node at same level (sibling)
struct node *parent; // points to parent
} node;
节点。
我想编写一个函数,将树的根改变为另一个(指定)节点,并且释放所有节点的内存 - 由于根的变化 - 不再是树的一部分即如果一个节点不能通过父节点追溯到新的根目录,它应该被设置为NULL
并且它的内存应该被释放)。
举例来说,如果这是我的树:
1
/\
2 3
/\ \
4 5 6
/\
7 8
,我想根本改变,从1到3,然后调用prune_tree功能后,根将是3,每个节点的内存除了3和6以外,将被释放。
我来解决我的问题,最近的包括这样的功能:
void prune_tree(node **root, node *new_root) {
if (*root == NULL || (*root)->parent == new_root)
return;
prune_tree(&((*root)->child), new_root);
prune_tree(&((*root)->next), new_root);
free(*root);
*root = NULL;
}
后调用这个函数我设置
root = new_root;
我来到这里主要是通过试验和错误;事实上,我甚至不知道为什么这个测试大部分时间都是这样。它还增加了在调用该函数之后必须将根设置为新根地址的不必要步骤。我假设有一种方法可以修改函数中的根地址,或返回新的根地址。
我认为我不需要担心内存使用,因为函数释放内存,但是省时的函数更可取。我不知道这是否意味着我应该避开递归或不...
对于返回新地址的方法,可以使用调用递归'prune_tree'并返回新根的包装器函数。然后包装函数将被调用,而不是原来的'prune_tree'。 –