在C中删除左子树节点(二叉搜索树)

时间:2016-12-14 01:47:21

标签: c tree binary-search-tree

我正在研究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");
    }
}

这个方法编译,但是当我尝试调用它时程序崩溃。我不明白为什么或如何做这个功能。

谢谢你!

1 个答案:

答案 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程序员至关重要。

相关问题