插入时树中的遍历指针
Traversal pointer in tree while insertion
#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 会改变 'actual' 根(在本例中为 2)。
But, pos isn't inserting all the elements and also not displaying the required results.
我觉得主要有两个bug。
root
永远不会在当前的 insert
函数中更新,因为 ptr
只是在 while 循环完成后才分配给时间变量 pos
.
我们应该考虑传递参数data
的值已经保存在二叉树中的情况。
此外,preorder
一次又一次地显示 root
令人困惑。
下面是修复 insert
和 preorder
的示例。
DEMO is here.
node insert(int data)
{
node *ptr = new node;
ptr->data = data;
ptr->left = nullptr;
ptr->right = nullptr;
if(!root)
{
root = ptr;
}
else
{
node *pos = root;
while(true)
{
if(pos->data > data)
{
if(!pos->left){
pos->left = ptr;
break;
}
pos = pos->left;
}
else if(pos->data < data)
{
if(!pos->right){
pos->right = ptr;
break;
}
pos = pos->right;
}
else{
break;
}
}
}
return *root;
}
void preorder(node *next)
{
if(next)
{
cout << next->data << std::endl;
preorder(next->left);
preorder(next->right);
}
}
#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 会改变 'actual' 根(在本例中为 2)。
But, pos isn't inserting all the elements and also not displaying the required results.
我觉得主要有两个bug。
root
永远不会在当前的insert
函数中更新,因为ptr
只是在 while 循环完成后才分配给时间变量pos
.我们应该考虑传递参数
data
的值已经保存在二叉树中的情况。
此外,preorder
一次又一次地显示 root
令人困惑。
下面是修复 insert
和 preorder
的示例。
DEMO is here.
node insert(int data)
{
node *ptr = new node;
ptr->data = data;
ptr->left = nullptr;
ptr->right = nullptr;
if(!root)
{
root = ptr;
}
else
{
node *pos = root;
while(true)
{
if(pos->data > data)
{
if(!pos->left){
pos->left = ptr;
break;
}
pos = pos->left;
}
else if(pos->data < data)
{
if(!pos->right){
pos->right = ptr;
break;
}
pos = pos->right;
}
else{
break;
}
}
}
return *root;
}
void preorder(node *next)
{
if(next)
{
cout << next->data << std::endl;
preorder(next->left);
preorder(next->right);
}
}