得到成功二进制搜索树c ++数据结构

时间:2016-06-17 04:45:37

标签: c++ data-structures tree binary-search-tree

我有二进制搜索树,我想得到它的元素的继承者我看到我的代码很好,但我不知道什么是错的115运行时错误,5是5,它应该是6

    #include<bits/stdc++.h>
    using namespace std;

    struct Node
    {
        int data;
        Node *root;
        Node *left;
        Node *right;

    };

    typedef Node *ptr;

     ptr search(ptr tree,int key)
    {
        if(tree==NULL)return tree;
        if(tree->data==key)
            return tree;
        else if(tree->data>key)
            search(tree->right,key);
        else search(tree->left,key);
    }

    ptr most_left(ptr tree)
    {
        ptr result=tree;
        if(tree==NULL)return NULL;
        while(result->left!=NULL)
            result=result->left;
        return result;
    }

    ptr most_right(ptr tree)
    {
        ptr result=tree;
        if(tree==NULL)return NULL;
        while(result->right!=NULL)
            result=result->right;
        return result;
    }

    ptr min_element(ptr tree)
    {
        ptr result=tree;
        if(tree==NULL)return NULL;
        while(result->left!=NULL)
            result=result->left;
        return result;
    }

    ptr max_element(ptr tree)
    {
        ptr result=tree;
        if(tree==NULL)return NULL;
        while(result->right!=NULL)
            result=result->right;
        return result;
    }
    ptr temp=NULL;
    ptr insert_element(ptr &tree,int key)
    {

        if(tree==NULL)
        {
        tree=new Node();
        tree->data=key;
        tree->root=temp;
        return tree;
        }
        else if(tree->data>=key)
        {
        temp=tree;  
        insert_element(tree->left,key);
        }
        else 
        {
            temp=tree;
            insert_element(tree->right,key);
        }

    }

    void in_order(ptr tree)
    {
        if(tree == NULL) return;
        in_order(tree->left);
        cout<<tree->data<<" ";
        in_order(tree->right);
    }

    void pre_order(ptr tree)
    {
        if(tree == NULL) return;

        cout<<tree->data<<" ";
        pre_order(tree->left);
        pre_order(tree->right);
    }

    void post_order(ptr tree)
    {
        if(tree == NULL) return;
        post_order(tree->left);
        post_order(tree->right);
        cout<<tree->data<<" ";
    }

    ptr succesor(ptr node)
    {
        if(node->right != NULL) return min_element(node->right);
         ptr y = node->root;
        while(y != NULL && node == y->right ) {
            node = y;
            y = y->root;

        }
        return y;
    }

    int main() 
    {   
        ptr tree = NULL;
        insert_element(tree,7);
        insert_element(tree,5);
        insert_element(tree,55);
        insert_element(tree,6);
        insert_element(tree,15);
        insert_element(tree,60);
        insert_element(tree,10);
        insert_element(tree,115);
        ptr inserted = insert_element(tree,5);
        insert_element(tree,6);
        insert_element(tree,12);
        cout<<"succesor "<<succesor(inserted)->data;
        cout<<"\nData Inserted \n"<<"In order : ";
        in_order(tree);
        cout<<endl;
        cout<<"Pre order : ";
        pre_order(tree);
        cout<<endl;
        cout<<"Post order : ";
        post_order(tree);
        cout<<endl;
        cout<<"Minimum : "<<min_element(tree)->data<<endl;
        cout<<"Maximum : "<<max_element(tree)->data<<endl;
        return 0;
    }

1 个答案:

答案 0 :(得分:2)

  1. &#34; 5应为6&#34;
    不,该计划是绝对正确的 在insert_element功能中,您检查了tree->data >= key(请注意&gt; = ),因此如果已经存在与要插入的密钥具有相同数据的元素,则新密钥将插入左子树。这就是为什么最后插入的5的后继者是先前插入的5.如果用>=替换>,则第二个5将插入到右子树中,因此其后继符号为6。 / p>

  2. 115的继任者的运行时错误 当然,115没有继承者,因为这是最大的价值。因此,succesor函数返回一个NULL指针,如果取消引用,则会导致未定义的行为。

  3. 顺便说一下,程序有更多未定义的行为。函数searchinsert_element可能会在函数末尾流出而不返回值。标准说:

      

    离开函数末尾相当于没有值的返回;这会导致值返回函数中的未定义行为。 (6.6.3)

    在这种情况下,你很幸运,因为在大多数实现中,存储返回值的位置保持其值来自递归调用的return语句,但是,当然,这应该是固定的。