我正在研究C二叉搜索树库,我试图编写一个删除树子树的左节点的函数。这是我树的结构:
struct Node {
int value;
struct Node *left;
struct Node *right;
};
typedef struct Node TNode;
typedef struct Node *binary_tree;
树的创建方式如下:
binary_tree NewBinaryTree(int value_root) {
binary_tree newRoot = malloc(sizeof(TNode));
if (newRoot) {
newRoot->value = value_root;
newRoot->left = NULL;
newRoot->right = NULL;
}
return newRoot;
}
添加元素:
void Insert(binary_tree *tree, int val) {
if (*tree == NULL) {
*tree = (binary_tree)malloc(sizeof(TNode));
(*tree)->value = val;
(*tree)->left = NULL;
(*tree)->right = NULL;
} else {
if (val < (*tree)->value) {
Insert(&(*tree)->left, val);
} else {
Insert(&(*tree)->right, val);
}
}
}
我做的delleftsubtreenode:
void delleftsubtree(binary_tree *tree){
if( (*tree)->value!=NULL )
{
free(&(*tree)->left);
delleftsubtree( &(*tree)->left);
}
else
{
printf("end");
}
}
这个方法编译,但是当我尝试调用它时程序崩溃。我不明白为什么或如何做这个功能。
谢谢你!答案 0 :(得分:2)
奥拉夫在评论中说,你有几个问题;打电话&#34;免费()&#34;用指针然后尝试取消引用它,并使用双重间接。
binary_tree* tree; /* why use a pointer to a pointer? */
除非您打算更改指针的值,否则这是您不想做的额外工作。所有这些&#34; (*tree)->member
&#34;如果你遵循惯例,我就不需要表达,而且我不相信你理解&#34;&amp;(* tree) - &gt; left&#34;正在做。
我并不是说你永远不应该使用指向指针的指针,我自己已经完成了,但你应该只在有理由改变引用指针的值时才这样做,或者使用可能由某个外部actor改变的易失性指针;这在垃圾收集和压缩池(例如某些BASIC解释器中的字符串)之外不太可能并且相当罕见。
请记住&#34;左&#34;树中节点的子树本身就是二叉树;它有左右节点。您需要编写一个删除给定节点及其下的子树的函数。一旦理解了,删除节点下面的左子树就像下面这样简单:
void delSubtree(NodeT* subRoot)
{
if (subRoot != NULL)
{
delSubtree(subRoot->left);
delSubtree(subRoot->right);
free(subRoot);
}
}
void delLeftSubtree(NodeT* root)
{
if (root != NULL)
{
delSubtree(root->left);
root->left = NULL;
}
}
如果这是作业,你应该自己解决这些问题,而且我没有给你代码样本。了解如何使用指针和链接数据结构(列表,树和其他图形)对于成为一名成熟的C程序员至关重要。