插入时树中的遍历指针

时间:2018-11-05 09:28:21

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

#include<iostream>

using namespace std;

struct node
{
    int data;
    node *right;
    node *left;
} ;

node *root = NULL;
node *right = NULL;
node *left = NULL;

node insert(int data)
{
    node *ptr = new node;
    ptr->data = data;
    ptr->left = NULL;
    ptr->right = NULL;

    if(root==NULL)
    {
        root = ptr;
        cout<<"Inserted "<<root->data<<" at root\n";
    }
    else
    {
        node *pos = root;
        while(pos)
        {
            cout<<pos->data<<" pos->data\n";
            if(pos->data > data)
            {
                cout<<pos->data<<": data\n";
                pos = pos->left;
            }
            else if(pos->data < data)
            {
                cout<<pos->data<<": data\n";
                pos = pos->right;
            }
            if(!pos)
                cout<<"NULL\n";
        }
        pos = ptr;
        cout<<"Inserted\n";
    }
    return *root;
}

void preorder(node *root)
{
    if(root)
    {
        cout<<root->data;
        preorder(root->left);
        preorder(root->right);
    }
}

int main()
{
    insert(2);
    insert(1);
    insert(3);
    insert(4);
    insert(5);
    preorder(root);
    return 0;
}

在这里,在插入新元素时,我将root指向新变量pos,以便使root保持不变,以便它正确地成为函数preorder()的参数,因为它是实际根数

但是,pos不会插入所有元素,也不会显示所需的结果。简而言之,我必须使用root而不是pos进行插入,但是直接使用root会更改“实际”根(在本例中为2)。

1 个答案:

答案 0 :(得分:1)

  

但是,pos并没有插入所有元素,也没有显示所需的结果。

我认为主要是两个错误。

  • normal永远不会在当前root函数中更新,因为insert仅在while循环完成后才分配给时间变量ptr

  • 我们应该考虑以下情况:传递的参数pos的值已保存在二进制树中。

此外,data一次又一次显示preorder,令人困惑。 下面是一个修复rootinsert的示例。 DEMO is here.

preorder