您的位置:首页 > 编程语言 > C语言/C++

C语言中递归常见错误解析(1)

2017-04-19 21:40 429 查看
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)在递归程序中,如果需要修改变量的值,最好是在函数调用过程中直接调用值,而不是修改之后再调用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: