二叉树非递归遍历

二叉树的三种遍历非递归实现 二叉树遍历实现 阅读详情

面试的时候可能会问到二叉树的非递归遍历。

下面是自己写一些二叉树遍历的非递归的代码,仅供参考:

二叉树节点:

class TreeNode {   //二叉树节点
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}


二叉树前序遍历非递归

代码:

public void preorder(TreeNode root){
    	if(root==null)
    		return ;
    	
    	TreeNode p = root;
    	Stack<TreeNode> stack = new Stack<TreeNode>();
    	
    	while(p!=null || !stack.empty()){
    		while(p!=null){
    			System.out.println(p.val);
    			stack.push(p);
    			p=p.left;
    		}
    		while(p==null && !stack.empty()){
    			p=stack.pop();
    			p=p.right;
    		}
    	}
    }


二叉树中序遍历非递归

代码:

public void Midd(TreeNode root){ //实现二叉树中序遍历非递归
		if(root==null)
			return ;
		
		TreeNode p=root;
		Stack<TreeNode> stack =new Stack<TreeNode>();
		while(p!=null || !stack.empty()){
			while(p!=null){
				stack.push(p);
				p=p.left;
			}
			if(p==null && !stack.empty()){
				p=stack.pop();
				System.out.println(p.val);
				p=p.right;
			}
		}
	}


二叉树后序遍历非递归:

后序遍历应该是比较难写的一个,思路是拿到根节点,先将根节点的左子树全部压栈,当遇到左子树为空,则从栈中弹出(用peek,得到节点,但不从栈中删除)一个节点(注意栈中的节点的左子树都是处理过得,所以弹出来的节点不用考虑左子树),判断右子树是否为空,如果右子树为空,则将该节点的值输出,然后把该节点弹出(用pop()弹出节点,这个节点就处理完了),循环处理,直到某个节点的右子树不为空, 如果右子树不为空,则转向处理右子树,但这时要对栈顶节点进行处理,将右指针设为null(可以理解为右子树已经处理),处理右子树。

代码:

public static void postorder(TreeNode root){
		if(root==null)
			return ;
		
		Stack<TreeNode> stack = new Stack<TreeNode>();
		TreeNode p = root;
		TreeNode temp;
		while(p!=null || !stack.empty()){
			while(p!=null){
				stack.push(p);
				p=p.left;
			}
			if(p==null && !stack.empty()){
				p=stack.peek();
				while(p.right==null){ //如果右指针为空,则左右都处理完了,需要处理本节点
					p=stack.pop();
					System.out.println(p.val);
					if(!stack.empty())
					   p=stack.peek();
					else
						return ;
				}
				if(p.right!=null){
					temp=p.right; //如果栈里弹出来的TreeNode右指针不为null,则处理右指针
					p.right=null;
					p=temp;
				}
			}
		}
		
	}




二叉树非递归遍历和层次遍历详解 二叉树非递归遍历非递归的后序遍历二叉树 //非递归的后续遍历二叉树 void HXprint(Tree *tree){ Stack s = initStack(); //初始化一个下面使用的栈 treeNode *p = tree; //新建一个遍历指针 treeNode *r=NULL; //辅助变量 cout<<"-------"<<endl; while(p||!isEmpty(s)){ //当遍历变量和栈同时为空时 表示遍历完成 阅读详情

相关推荐

非递归遍历二叉树

1.先序遍历从递归说起void preOrder(TNode* root){    if (root != NULL)    {        Visit(root);        preOrder(root->left);        preOrder(root->right);    }}递归算法非常的简单。先访问跟节点,然后访问左节点,

重剑无锋 5万+

二叉树遍历(非递归)

遍历二叉树, 是指按一定的规则和顺序访问二叉树的所有结点, 使每一个结点都被访问一次, 而且只被访问一次.也可以是NRL, 因为这两种遍历方法都是先访问根结点, 所以没有区别, 掌握其中一种, 另一种也随之掌握.BFS: 是指沿着二叉树的宽度优先遍历二叉树的结点, 即从上到下从左到右逐层遍历二叉树的结点.由于二叉树是非线性结构, 因此, 二叉树遍历实质上是将二叉树的各个结点排列成一个线性序列.层序遍历就是根据二叉树的结构从上到下从左到右逐层遍历二叉树的结点.给你一棵二叉树的根节点。

m0_61433144的博客 9104

二叉树非递归遍历:先根遍历、中根遍历、后根遍历

二叉树非递归遍历 二叉树的三种遍历方式也可以通过非递归的方法借助栈来实现。 通过控制节点的出栈和入栈先后顺序来实现对树的不同方式的遍历非递归先根遍历二叉树 当栈不为空或者当前节点为不为空,执行操作: 从根节点开始,依次访问树中最左端的节点并入栈,当节点为空停止入栈。 取栈顶元素为当前节点并出栈,如果当前节点有右子树,则遍历其右子树。 void PreorderPrint(...

SanFancsgo的博客 8308

二叉树非递归遍历

二叉树非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 ​ 三种遍历方式访问节点的顺序是一致的,不同之处在于,有的遍历流程把访问到的节点暂存起来,达成某种条件后再将节点输出。

qq_43169752的博客 1万+

二叉树:后序遍历非递归算法

分析:后序遍历是三种遍历中最难的一种,后序遍历的特点为左右根,并且也需要借助一个栈来完成,如图,虚线表示p,q最开始的位置,用r指向最近访问过的结点。首先从根节点开始,沿着根的左孩子,将左孩子依次进行入栈。当D入栈之后,由于D没有右孩子,所以将D出栈,此时r指向D。 D出栈之后读栈顶元素B,p指向B,发现B有右孩子,然后将右孩子E入栈。 然后判断栈顶元素E,E没有右孩子了,所以将E出栈,此时r指向E。 然后判断栈顶元素B,B的两个孩子都已经操作过了,所以B出栈,p指向A,判断栈顶元素A,A有右孩子,右孩

花间半盘棋 2万+

二叉树遍历之后序遍历非递归、递归)入门详解

二叉树后序遍历不如先序遍历简单,是相对最复杂的一种遍历方法。访问结点的次序是:“左—>右—>根”,也就是首先访问左子树,之后访问右子树,最后访问树根。对于左、右子树而言,其访问的次序依然是“左—>右—>根”。也就是说,对于每一棵子树,都是最后访问树根。...

sunnyoldboy博客 3万+

数据结构学习——树形结构之非递归遍历二叉树

本文为大家介绍了数据结构学习——树形结构之非递归遍历二叉树,希望对你有帮助~~

weixin_53919192的博客 1920

详解二叉树非递归遍历

本文转载自:http://blog.csdn.net/zhangxiangdavaid/article/details/37115355 前言   对于二叉树的递归遍历比较简单,所以本文主要讨论的是非递归版。其中,中序遍历非递归写法最简单,后序遍历最难。 节点的定义: //Binary Tree Node typedef struct node { int data; ...

编程随笔与杂谈 10万+

二叉树遍历非递归算法

•三种遍历​ • 先序遍历: 根节点–>左子树–>右子树​ • 中序遍历: 左子树–>根节点–>右子树​ • 后序遍历: 左子树–>右子树–>根节点•两类算法​ • 递归算法(具体看我上一篇文章)​ ♥直观,易读​ ♥效率低下​ • 非递归算法​ ♥ 如果一个算法可以使用递归或循环来进行完成,在不影响代码阅读的情况下,可以使用循环,来降低复杂度。下面介绍二叉树遍历,把用。

qq_57484399的博客 6167

二叉树遍历的一些非递归算法

非递归二叉树遍历等算法C语言

m0_66120913的博客 1万+

二叉树】(非递归)四种遍历

树的概念与结构 二叉树 概念与结构 性质 存储结构 二叉树遍历 二叉树的定义 前序遍历 中序遍历 后序遍历 层序遍历 二叉搜索树 AVL树 红黑树

知识分享与学习笔记总结,欢迎指点 2652

非递归实现二叉树遍历(附c++完整代码)

先序、中序和后序遍历过程:遍历过程中经过结点的路线一样,只是访问各结点的时机不同。 从图中可以看到,前序遍历在第一次遇见元素时输出,中序遍历在第二次遇见元素时输出,后序遍历在第三次遇见元素时输出。 非递归算法实现的基本思路:使用堆栈 一、前序遍历 1、递归实现 遍历过程为: 访问根结点; 先序遍历其左子树; 先序遍历其右子树。 void ProOrderTraverse(BiTree tre...

桑凯旋的博客 2万+

Leetcode145 二叉树的后序遍历

给你一棵二叉树的根节点root,返回其节点值的后序遍历 知识点:栈 栈是一种仅支持在表尾进行插入和删除操作的线性表,这一端被称为栈顶,另一端被称为栈底。元素入栈指的是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;元素出栈指的是从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。 思路: 既然二叉树的前序遍历和中序遍历都可以使用栈来代替递归,那后序遍历是否也可以呢?答案是可以的,但是会比前二者复杂一点点。 根据后序遍历“左右中”的顺序,那么后序遍历...

neverSaynever_的博客 683

二叉树的4种非递归遍历

二叉树的4种非递归遍历,你知道吗?

2023

【数据结构】题解:二叉树非递归遍历

二叉树非递归实现

qq_66725576的博客 753
上一篇: ubuntu14.04安裝numpy,scipy
下一篇: Leetcode 109. Convert Sorted List to Binary Search Tree
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值