#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)。
答案 0 :(得分:1)
但是,pos并没有插入所有元素,也没有显示所需的结果。
我认为主要是两个错误。
normal
永远不会在当前root
函数中更新,因为insert
仅在while循环完成后才分配给时间变量ptr
。
我们应该考虑以下情况:传递的参数pos
的值已保存在二进制树中。
此外,data
一次又一次显示preorder
,令人困惑。
下面是一个修复root
和insert
的示例。
DEMO is here.
preorder