书上有个例题看不懂啊,二叉树查找数据元素,C高手帮帮忙 O_O (菜鸟在线)

来源:百度知道 编辑:UC知道 时间:2024/06/01 09:18:07
二叉树查找数据元素:

BiTree Search(BiTree *bt,elemtype x)
{
BiTree p;
p=bt;

if(p->data==x) return p;
if(p->Lchild!=null)
return(Search(p->Lchild,x));......//这句
书上说在 p->Lchild为根结点指针的二叉树可查找数据
元素。 可是要是找不到,就return null;不会
执行下句的右子树里查找了?如果找的元素在右子树,
那就找不到了,到底是不是这样??

if(p->Rchild!=null))
return(Search(p->Rchild,x));
return null;
}

高手帮我分析一下,多谢了、

(是,如果有左子树 则查询左子树,如果没左子树,但是有右边子树则查询右子树木..2个都没有,则返回null)
但是一个查询程序应该不应该return ,因为return 的话 就会当左子树查询不到,则返回null,就不会在继续查询了

所以不用return 那么这个程序应该算中序遍历.
中(根) 左 右 这样的顺序就是中序遍历;

这样程序就变成..
1,设第一次进入这个函数 传入根节点 ,他先判断这个根节点是否 符合要求?符合 返回点:不符合 进入步骤2
2,当根节点不符合要求,判断其是否含有左孩子,如果有 传入左子树根节点(就是其左孩子).重新进入步骤1;如果上面 左孩子为空 进入步骤3
3,当根节点不符合要求 其左孩子不符合要求 则判断其右孩子,其右孩子如果不为空,传入右子树根节点(就是其右孩子).重新进入步骤1;如果上面右孩子为空,则进入步骤4
4,当以上的所有都不符合要求 意味,以此为根节点的子树找不到合适的数字,(但是不能否认所有子数都没有符合要求的结果)

恩。
简单来说:函数里一旦遇到return就返回,不再执行return下面的语句。

所以上面的函数中一旦执行到return(Search(p->Lchild,x));这句,函数就返回,下面右子树中的查找等语句就不执行了。

而执行这条return语句的条件就是上面的那个if成立:if(p->Lchild!=null) ,即左子树非空。

综合来看就是:
if当前结点(即函数中的第一个参数bt)的值为所查找的,就return当前结点。
if(左子树非空)就对左子树调用Search,并return函数Search的返回值。
if(右子树非空)就对右子树调用Search,并return函数Search的返回值。
return null;

任何一个if成立,函数都将返回,因为if后面接的都是return。
若三个if都不成立,就执行最后一条语句return null;