关于二叉搜索树的有关问题,实在不理解。求高手指导~
关于二叉搜索树的问题,实在不理解。求高手指导~~
学习二叉树以后经常看见书上有代码这样写的:
while(p)
{
......
......
p=p->link;
}
其中p是二叉树节点类型的指针。
很不理解为什么指针可以当放到while的括号里。我自己测试的时候,比如写一个结构体node。
struct bstnode
{
int data;
bstnode* left;
bstnode* right;
};
然后写程序测试
bstnode *test;
test=tset->left;////////////////测试行
if(test)
{
cout<<"yes"<<endl;
return 0;
}
如果没加测试行,会输出yes,我明明没有给这指针指向具体对象啊。怎么会是true?
还有加上测试行直接就出错了,不知道问题在哪里,求解救啊。。。希望能说详细点。
------解决方案--------------------
这得考虑编译器的原理了,我们知道int a;虽然没有赋初始值,但编译器会给其一个不确定的初始值(这个可以在编译器中自己尝试)。同样bstnode *test;这个类型声明,编译器也会给test指针一个垃圾值,所以if(test)的结果是true,但它指向的地方一般是非法的,即不可访问的……
所以正确的做法是,出现新指针声明时,就要给其初始化,这是开发规范……
你的测试行test写错了吧,应该是test=test->left;
学习二叉树以后经常看见书上有代码这样写的:
while(p)
{
......
......
p=p->link;
}
其中p是二叉树节点类型的指针。
很不理解为什么指针可以当放到while的括号里。我自己测试的时候,比如写一个结构体node。
struct bstnode
{
int data;
bstnode* left;
bstnode* right;
};
然后写程序测试
bstnode *test;
test=tset->left;////////////////测试行
if(test)
{
cout<<"yes"<<endl;
return 0;
}
如果没加测试行,会输出yes,我明明没有给这指针指向具体对象啊。怎么会是true?
还有加上测试行直接就出错了,不知道问题在哪里,求解救啊。。。希望能说详细点。
------解决方案--------------------
这得考虑编译器的原理了,我们知道int a;虽然没有赋初始值,但编译器会给其一个不确定的初始值(这个可以在编译器中自己尝试)。同样bstnode *test;这个类型声明,编译器也会给test指针一个垃圾值,所以if(test)的结果是true,但它指向的地方一般是非法的,即不可访问的……
所以正确的做法是,出现新指针声明时,就要给其初始化,这是开发规范……
你的测试行test写错了吧,应该是test=test->left;