二叉树中序遍历的迭代版本

问题描述:

二叉树遍历多是以递归的方式实现,迭代的实现需要借助于辅助的数据结构:栈。

中序的遍历顺序是:左子树,根,右子树。

  • 由于需要先访问左子树,所以采用栈对没有访问的元素进行暂时保存。
  • 元素从栈中弹出时才进行访问
  • 访问完成后将右子树压入栈中
  • 栈中的最后一个被访问的元素一定没有右子树。

初始化:

cur = root; stack<TreeNode*> st;

迭代过程:

while (!st.empty() || cur)
{
        if (cur)
        { st.push(cur); cur = cur->next; }
        else
        { cur = st.pop();  visit(cur); cur = cur->next;}
}

代码示例:

          /* 二叉树遍历的中序的迭代版本 
	   * 需要stack 结构, cur变量的帮助
	   * 每个节点都作为左子树被压入栈,作为根被访问,
	   * 再转入右子树做重复的处理
	   *
	   */
	void in_visit_iterative(node *root)
	{
		if (!root)
			return;

		node *cur = root;
		stack<node*> s;
		/* 
		 * 如何证明该循环不会是一个死循环 ?? 
		 * 最后一个被访问的元素肯定没有右子树
		 **/
		while (cur || !s.empty()) 
		{
			if (cur)
			{
				s.push(cur);
				cur = cur->l;
			}
			else
			{
				cur = s.top();
				s.pop();
				os << cur->dat << " ";
				cur = cur->r;
			}
		}
	}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值