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

4.总结

(1)在递归程序中,如果需要修改变量的值,最好是在函数调用过程中直接调用值,而不是修改之后再调用。

你可能感兴趣的:(#,C/C++)