1.不要直接修改代码,否则会给下面的程序导致错误,【不能正确的读入需要的值】
2.代码示例
BiTree* foundData(int postLeft,int postRight,int inLeft,int inRight){
int i,root;//需要添加到树中的根节点
int rootIndex;//记录根节点值在inOrder数组中的下标
root = postOrder[postRight];//根节点的值
for(i = inLeft;i <= inRight;i++){//是在中序数组左右区间中找匹配!!
/**
1.如果说两者值相等,即在中序遍历序列中找到了根节点值,就记录下根节点值在中序数组中
的下标。
**/
if(inOrder[i] == root ){
rootIndex = i;//记录相等时的下标值
break;//找到后不再寻找
}
}
//往树中添加信息
BiTree* T = new BiTree;//指向一个结点
T->data = root;//建立根节点的值
//先遍历左子树
if(rootIndex > inLeft){//如果还有左子树
int leftTreeNumber ;//查看左子树有多少
leftTreeNumber = rootIndex - inLeft;
postRight = postLeft + leftTreeNumber - 1;//postRight后移leftTreeNumber位
inRight = rootIndex - 1;
T->lChild=foundData(postLeft,postRight,inLeft,inRight);//找左子树
}
//接着遍历右子树
if(rootIndex < inRight){//还有右子树
postRight = postRight -1;
inLeft = rootIndex + 1;
T->rChild=foundData(postLeft,postRight,inLeft,inRight);//找右子树
}
return T;//返回
}
3.分析
在上面的这个建树过程中,我们可以看到,这是一个递归函数,我们在遍历建左子树之后,可能需要遍历建右子树,但是若在遍历建左子树的时候修改了postRight以及inRight的值,导致在下面判断if(rootIndex<inRight)判断失误,从而导致递归失败。
4.总结
(1)在递归程序中,如果需要修改变量的值,最好是在函数调用过程中直接调用值,而不是修改之后再调用。