二叉树非递归遍历的实现(2)——学习笔记

本文介绍了如何使用栈实现二叉树的非递归遍历,包括前序、中序和后序遍历。通过设置节点的遍历状态并根据状态决定节点的处理方式,实现了简洁的遍历算法。
摘要由CSDN通过智能技术生成

二叉树非递归遍历的实现(2)——学习笔记

前言

在Leetcode上发现一个非常实用而且简单的算法,分享给各位。
算法的优点在于如递归遍历一般,只需要简单调整代码的顺序,就可以轻松实现前、中、后序遍历。

思路

算法思路如下:

  1. 先建立一个堆栈。
  2. 针对堆栈中的每个节点,我们给它一个标签,false代表未遍历,true代表已遍历。
  3. 出栈时遇到标记为false的节点,将其左右节点分别标记为false插入堆栈,而节点本身标记为true
  4. 出栈时遇到标记为true的节点,直接将其输出。
  5. 重复上面操作直到堆栈为空。

代码

void Fun(Tree **root) {
	if (*root != NULL) {
	    // 堆栈
		stack<Tree*> s;
		//标签
		stack<bool> tab;
        
        //插入头指针,标签为false
		s.push(*root);
		tab.push(false);

		while (s.size() > 0) {
		    //弹出指针和标签
			Tree *p = s.top();
			bool c = tab.top();
			s.pop();
			tab.pop();

            //指针为空,continue
			if (p == NULL)
				continue;
            
            //标签为true,输出当前节点的值
            //标签为false,将左右节点标记为false插入,节点本身标记为true插入
			if (c) {
				cout << p->val << " ";
			}
			else {
			    //前序遍历
				s.push(p->right);
				tab.push(false);
				
				s.push(p->left);
				tab.push(false);
				
				s.push(p);
				tab.push(true);
                //------------------//
                //中序遍历
                //s.push(p->right);
				//q.push(false);

				//s.push(p);
				//q.push(true);

				//s.push(p->left);
				//q.push(false);
                //------------------//
                //后序遍历
                //s.push(p);
				//q.push(true);

				//s.push(p->right);
				//q.push(false);

				//s.push(p->left);
				//q.push(false);
			}
		}

		cout << "\n";
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值