这是我试图解决这个特定问题的地方: http://mycodeschool.com/work-outs/binary-search-trees/7
如果要删除的节点同时具有子节点,则采用的策略是用其左子树中的最大值替换该节点(将其称为MAX_LEFT)。然后你可以简单地删除节点MAX_LEFT。这个策略也在我们的视频中讨论了这个问题。
我试图通过下面的代码来解决这个问题。但是有一些问题,我没有得到预期的输出。
struct Node
{
int data;
struct Node* left;
struct Node* right;
}
Node* FindMax(Node* root)
{
if(root==NULL)
return NULL;
while(root->right != NULL)
{
root = root->right;
}
return root;
}
Node* DeleteNodeInBST(Node* root,int data)
{
if(root==NULL) return root;
else if(data<=root->data)
root->left = DeleteNodeInBST(root->left, data);
else if (data> root->data)
root->right = DeleteNodeInBST(root->right, data);
else
{
//No child
if(root->right == NULL && root->left == NULL)
{
delete root;
root = NULL;
}
//One child
else if(root->right == NULL)
{
Node* temp = root;
root= root->left;
delete temp;
}
else if(root->left == NULL)
{
Node* temp = root;
root= root->right;
delete temp;
}
//two child
else
{
Node* temp = FindMax(root->left);
root->data = temp->data;
root->left = DeleteNodeInBST(root->left, temp->data);
}
}
return root;
}
答案 0 :(得分:3)
在下面的代码段中,在2 else if 语句之后,最后的 else 语句永远不会被执行,因为没有其他可能性:
else if(data<=root->data)
root->left = DeleteNodeInBST(root->left, data);
else if (data> root->data)
root->right = DeleteNodeInBST(root->right, data);
else
....
答案 1 :(得分:3)
这部分
if(data<=root->data)
root->left = DeleteNodeInBST(root->left, data);
else
...
当data
等于到当前节点root
时,也将逐步降低到左子树。因此,您永远不会到达第三个else
。尝试将<=
替换为<
。
答案 2 :(得分:1)
知道了。我必须删除&#34; =&#34; in&#34;否则if(data&lt; = root-&gt; data)&#34;然后就可以了。