![](/img/trans.png)
[英]Binary Search Tree in C- error in deleting node with both left and right subtree
[英]Delete left subtree node (binary search tree) in C
我正在使用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");
}
}
這種方法可以編譯,但是當我嘗試調用它時,程序只是崩潰了。我不知道為什么或其他方式執行該功能。
謝謝!
正如奧拉夫(Olaf)在評論中所說,您有幾個問題。 使用指針調用“ free()”,然后嘗試取消引用,並使用雙重間接尋址。
binary_tree* tree; /* why use a pointer to a pointer? */
除非您打算更改指針的值,否則這是您不想做的額外工作。 如果遵循通常的約定,則不需要所有這些“ (*tree)->member
”表達式,而且我不確信您了解“&(* tree)-> left”的作用。
我並不是說您永遠不要使用指向指針的指針,而是由我自己完成的,但是,只有在有理由要更改引用的指針的值或使用易失性指針來更改指針時,才應使用它可能會被一些外部演員改變; 在垃圾收集和壓縮池(例如某些BASIC解釋器中的字符串)等之外,這是不太可能且相當罕見的。
請記住,樹中節點的“左”子樹本身就是二叉樹。 它既有左節點又有右節點。 您需要編寫一個函數來刪除給定節點及其下方的子樹。 理解之后,刪除節點下方的左子樹就很簡單:
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程序員至關重要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.