请问这样建二叉树有什么问题?

icelover 2005-07-04 10:11:59
为什么只能插入第一个结点,后面的b和c都不能插入呢?
#include <iostream>
using namespace std;

class TreeNode
{
public:
int value;
TreeNode *left;
TreeNode *right;
TreeNode()
{
value = 0;
left = right = NULL;
}
~TreeNode()
{
left = right = NULL;
}
TreeNode(int avalue)
{
value = avalue;
left = right = NULL;
}
};

TreeNode *root = NULL;

void insert(TreeNode *newnode, TreeNode **root)
{
if(*root == NULL)
{
*root = newnode;
return;
}
if((newnode)->value < (*root)->value)
{
insert(newnode,&((*root)->left));
}
else if((newnode)->value >= (*root)->value)
{
insert(newnode,&((*root)->right));
}

}

int main()
{
TreeNode *a = new TreeNode(1);
TreeNode *b = new TreeNode(5);
TreeNode *c = new TreeNode(4);
insert(a,&root);
insert(b,&root);
insert(c,&root);
cout<<root->value<<endl;
// cout<<(root)->left->value<<endl;
// cout<<(root)->left->value<<endl;

}
...全文
122 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
boxban 2005-07-04
  • 打赏
  • 举报
回复
void insert(TreeNode *newnode, TreeNode **root)
{
if(*root == NULL)
{
*root = newnode;
return;
}
这段代码虽然能够正确工作,但不是好的风格:全局root被局部root遮盖了
du51 2005-07-04
  • 打赏
  • 举报
回复
你给的程序没错.错在输出的时候非法访问.即,节点为空.
对于你说的你朋友的情况.很可能涉及到内在分配的问题.
单纯的改变指针指向是带不回来的.
要动态的申请空间.或用引用的指针,或用指针的指针.
你朋友那个函数里可能有这个东西.
但是,不用那个函数时,可能只是改变指针的方向了.
所谓后来的乱了,也就是指针被重赋值,指向改变.空间丢失.

呵呵,猜的.
junguo 2005-07-04
  • 打赏
  • 举报
回复
作用域和编译器有关系的,当你释放一块内存的时候,是说你的那块内存可以被分配给其它变量了。但如果这部分内存还没有用前,该部分的内容还可以保留一段时间。
icelover 2005-07-04
  • 打赏
  • 举报
回复
以前的main函数里面是这样的
insert(a,&root);
insert(b,&root);
cout<<root->left->value<<endl;
cout<<root->left->value<<endl;
这样第一行cout是正确的,第二行cout是错误的,看了junguo的解释之后,可能由于作用域的问题,
我就在insert(b,&root)和第一行cout之间再插入了一行cout<<endl;结果第一行cout也出错了,为什么要经过一行后作用域才失效呢?我觉得如果仅仅是栈的原因应该不会是这样阿,不过他的insert里面用到了很多指针的指针,是不是因为这个的原因需要经过一行然后作用域才失效?
icelover 2005-07-04
  • 打赏
  • 举报
回复
但是为什么每次都是第一行正确,第二行失败呢
在Debug中监视发现在第一行的时候这个树的所有内容都是正确的(不光是根节点),只要一到第二行,树的所有东西都变乱了
有没有可能是栈的释放有什么机制
junguo 2005-07-04
  • 打赏
  • 举报
回复
没有具体看到程序,但我估计原因如下:
insert里定义要考虑变量的作用域的,分配在栈上,出了函数的作用域,变量就被删除掉了。
肯定应该分配在堆上。你的程序中第一行运行正确,也是一件偶然事件。
icelover 2005-07-04
  • 打赏
  • 举报
回复
喔,这个确实搞疏忽了,实际上b是a的right,c是b的left,a的left为NULL
这个问题是别人问的一个问题的简化的版本,他是做图形学的一个算法,在insert里面,他定义了两个TreeNode类型的变量inface和outface,然后插入的时候不是比较的value,而是通过另外一个函数通过传地址把newnode分割成inface和outface,利用特定的算法进行比较
最奇怪的是在main函数中
cout<<root->left->value<<endl;
cout<<root->left->value<<endl;
两行同样的语句联在一起,也没有多线程干扰,为什么第一行打印的是正确的,第二行打印的是错的,但是后来在insert中把inface和outface改成TreeNode *inface = new TreeNode()和TreeNode *outface= new TreeNode();就是以前是分配在栈上,现在分配在堆上,结果又好了
不知道大家遇到过这样的问题没有,因为里面用了很多指针,我以前以为是指针的问题,但是为什么第一行打印的是正确的,结果第二行又是错的呢?
junguo 2005-07-04
  • 打赏
  • 举报
回复
加进去了,你应该这样输出!

int main()
{
TreeNode *a = new TreeNode(1);
TreeNode *b = new TreeNode(5);
TreeNode *c = new TreeNode(4);
insert(a,&root);
insert(b,&root);
insert(c,&root);
cout<<root->value<<endl;
cout<< root->right->value << endl;
cout<< root->right->left->value << endl;
// cout<<(root)->left->value<<endl;
// cout<<(root)->left->value<<endl;

}

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧