删除二进制搜索树中的节点

时间:2017-12-18 18:50:03

标签: c++ algorithm binary-search-tree

我编写了删除二进制搜索树中节点的代码。 代码:

#include<iostream>
using namespace std;
struct Node {
    int value; 
    Node* left;
    Node* right;
};
Node* GetNewNode(int data) {
    Node* newNode = new Node();
    newNode->value = data;
    newNode->left = newNode->right = NULL;
    return newNode;
}
void Insert(Node* &root,int x)
{
    if(root==NULL) root=GetNewNode(x);
    else if(x>root->value) Insert(root->right,x);
    else Insert(root->left,x);
}
Node* Search(Node* root,int x) 
{
    if(root->value==x) return root ;
    else if(root->value>x) Search(root->left,x);
    else if(root->value<x) Search(root->right,x);
}
Node* Searchmin(Node* root) 
{
    if(root==NULL) cout<<"Empty tree"<<endl;
    if(root->left==NULL) return root;
    else Searchmin(root->left);
}

void Inorder(Node* root)
{
    if(root==NULL) return;
    else {
        Inorder(root->left);
        cout<<root->value<<endl;
        Inorder(root->right);
    }
}
Node* deleteNode(Node* root, int x)
{
    Node* nodeptr;
    nodeptr=Search(root,x);
    if(nodeptr->left==NULL && nodeptr->right==NULL) return nodeptr;
    else if(nodeptr->left==NULL && nodeptr->right!=NULL)
    {
      nodeptr->value=nodeptr->right->value;
      nodeptr=nodeptr->right;
      return nodeptr;   
    }
    else if(nodeptr->right==NULL && nodeptr->left!=NULL)
    {
      nodeptr->value=nodeptr->left->value;
      nodeptr=nodeptr->left;
      return nodeptr;
    }
    else{
        nodeptr->value=Searchmin(nodeptr->right)->value;
        deleteNode(nodeptr->right,nodeptr->value);
        return nodeptr;}    
}
int main() 
{
    Node* root=NULL;
    Insert(root,20);
    Insert(root,15);
    Insert(root,25);
    Insert(root,10);
    Insert(root,16);
    Insert(root,7);
    Inorder(root);
    Node* x=deleteNode(root,7);
    delete x;
    Inorder(root);
}

编译器也没有显示任何语法错误。该计划正在崩溃。它甚至没有删除叶节点。我找不到错误。请帮忙。 (这些行只是为了扩展问题的长度,因为stackoverflow不接受在长代码和简短描述的行上生成错误。)

1 个答案:

答案 0 :(得分:1)

你的删除功能首先做的是调用搜索,搜索的第一件事是什么?

Node* Search(Node* root,int x) 
{
    if(root->value==x) return root ;

立即搜索解除引用root。它从不检查空指针。这意味着如果找不到树中的节点,它保证您的搜索功能将取消引用空指针。