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

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)在递归程序中,如果需要修改变量的值,最好是在函数调用过程中直接调用值,而不是修改之后再调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

说文科技

看书人不妨赏个酒钱?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值