非递归实现中序遍历

非递归实现中序遍历:

先附上代码:

//非递归实现中序遍历
void zhongXu(BiTree &T){
	Stack St;//利用栈,其实递归函数本质就是用的栈
	BiTree p = T;
	initStack(St);//初始化栈

	while(!isEmpty(St) || p){//这里必须是栈空并且p指向null了才退出
		if(p){
			push(St,p);
			p = p->lchild;//一路向北
		}
		else{
			pop(St,p);
			visit(p);
			p=p->rchild;//判断右孩子
}
	}//endwhile
}

思路:

	if(p){
			push(St,p);
			p = p->lchild;//一路向北
		}

p不为空时,将p压入栈,在找到其左孩子,直到p指向了最左边最下面的叶子结点的左孩子(null),此时,栈内应该是这样的(右侧为栈顶)

a1,a2,a3

在这里插入图片描述

因为p此时为null,接下来就会进入另外的代码

		else{
			pop(St,p);
			visit(p);
			p=p->rchild;//判断右孩子
}

你可以理解为p遇到了下限了就往回跑了,于是便将栈顶元素弹出,判断右孩子树的情况。
****注意:****为什么我们这里只判断右孩子就可以呢?因为左孩子早就被我们“一路向北”走完并且存在栈里了,这个时候你可以把已经进入栈的做分支当作主干,而里面每个节点都有对应的右孩子树,对这些右孩子树又是一样的过程(其实这里有递归的逻辑)
在这里插入图片描述

1.为什么使用在栈?
答:模仿递归函数的执行过程,需要依赖栈(后进先出)

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值