簡體   English   中英

刪除二叉搜索樹中的節點

[英]Deleting Node in 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不接受在長代碼和簡短描述的行上產生問題的錯誤。)

刪除功能要做的第一件事是調用搜索,搜索的第一件事是什么?

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

搜索立即取消引用root 它從不檢查空指針。 這意味着如果樹中沒有找到節點,則可以確保您的搜索功能將取消引用空指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM