二叉树的先、中、后序遍历及层次遍历的迭代版算法

标签: java 二叉树 遍历 迭代 算法
679人阅读 评论(0) 收藏 举报
分类:

二叉树的递归遍历无论是在时间还是在空间上都比迭代算法要大。因此,在实际使用时,应优先使用迭代式的算法。本文就这四种遍历方法进行实现和简介。

	//建二叉树
	public TreeNode build(int b){
		int n = a.length;
		TreeNode node;
		if(b<n){
		node = new TreeNode(a[b]);
		node.lChild = build(2*b+1);
		node.rChild = build(2*b+2);
		return node;
		}
		return null;
	}
	
	//先序
/*先序的思想是沿左枝遍历结点,并将各结点的右孩子放入栈中,在左枝遍历完之后,从栈中弹出元素。若弹出的结点有左孩子结点,则再沿以该结点为根的子树的左枝
来遍历结点,并将各结点的右孩子放入栈中,重复此过程*/
	public void preOrder(TreeNode root){
	    Stack<TreeNode> s = new Stack<TreeNode>();//构建一个栈
	    while(root != null){//从root开始,沿左枝遍历,并把右孩子逐个push进栈中
	        System.out.println(root.data);
	        if(root.rChild != null){
	            s.push(root.rChild);
	        }
	        root = root.lChild;
	    }
	    while(!s.isEmpty()){//出栈操作,直至栈空
	        TreeNode n = s.pop();
	        while(n != null){
	            System.out.println(n.data);
	            if(n.rChild != null){//如果出栈结点有左孩子,将其push进栈,沿左枝遍历访问左孩子结点,并将其右孩子psuh进栈
	                s.push(n.rChild);
	            }
	        n = n.lChild;
	    }
	    }
	}

/*中序遍历先以左枝遍历遍历结点,并把结点放入栈中,到左枝最后一个结点放入栈中时,开始从栈中弹出结点。弹出的结点有左孩子,则再沿左枝遍历入栈,重复此过程直
到栈为空*/
	public void midOrder(TreeNode root){
	    Stack<TreeNode> s = new Stack<TreeNode>();
	    while(root != null){//沿左枝遍历,并将左结点逐个push进栈
	        s.push(root);
	        root = root.lChild;
	    }
	    while(!s.isEmpty()){//出栈操作,直至栈空
	        TreeNode n = s.pop();
	        if(n != null){
	           System.out.println(n.data);//先访问出栈结点
	           if(n.rChild != null){//如果结点有右孩子,push进栈,并沿左枝遍历并将遍历过程中的结点push进栈
	                s.push(n.rChild);
	                TreeNode p = n.rChild;
	                while(p.lChild != null){
	                    s.push(p.lChild);
	                    p.lChild = p.lChild.lChild;
	                }
	            }
	        }
	    }
	}
/*后序遍历先将根节点放入s1栈中,再从s1中弹出,若结点有左孩子和右孩子,先将右孩子放入s1中,再将左孩子放入s1中。弹出s1中结点放入s2中,并判断是否有子结点若
有,按照之前的操作进行,如此重复直到s1为空。再从s2中弱出结点到空,*/
	public void posOrder(TreeNode root){
	    Stack<TreeNode> s1 = new Stack<TreeNode>();
	    Stack<TreeNode> s2 = new Stack<TreeNode>();
	    if(root != null){
	        s1.push(root);
	    }
	    while(root != null){//沿右枝遍历结点
	        if(root.rChild != null)
	            s1.push(root.rChild);//把右孩子Push进s1
	        if(root.lChild != null)
	            s2.push(root.lChild);//把左孩子push进s2
	        root = root.rChild;
	    }
	    while(!s2.isEmpty()){//将s2中结点出栈,放入s1中,
	        TreeNode n = s2.pop();
	        s1.push(n);
	        while(n != null){//沿右枝遍历,如果有右孩子则Push进s1,如果有左孩子Push进s2
	            if(n.rChild != null)
	                s1.push(n.rChild);
	            if(n.lChild != null)
	                s2.push(n.lChild);
	            n = n.rChild;
	        }
	    }
	    while(!s1.isEmpty()){//s1出栈,并遍历访问
	        TreeNode n = s1.pop();
	        System.out.println(n.data);
	    }
	}
/** 二叉树的层次遍历,从根结点开始放入队中,开始弹出队列中元素操作,弹出的同时,判断结点是否有子结点,先左后右进入队列,并再弹出开始结点判断,直到队列为空
	 */
	public void layerOrder(TreeNode node){
		Queue<TreeNode> q = new LinkedList<TreeNode>();
		if(node != null){
			q.add(node);
			while(!q.isEmpty()){
				TreeNode n = q.poll();
				System.out.println(n.data);
				if(n.lChild != null)
					q.add(n.lChild);
				if(n.rChild != null)
					q.add(n.rChild);
			}
		}
}


先序和中序的解释如图所示

后序用一个栈比较困难,两个栈会变得简单些。


            
查看评论

数据结构基础系列(6):树和二叉树

-
  • 1970年01月01日 08:00

java数据结构之二叉树的前中后遍历

感谢笃志近思的分享。原文链接地址为:点击打开链接 二叉树的定义: 二叉树是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉...
  • linzhiqiang0316
  • linzhiqiang0316
  • 2016-06-20 17:16:18
  • 1800

二叉树前中后遍历

最近做题的时候经常碰见二叉树的题,这次来个完整的遍历顺序,一劳永逸 遍历的方法有:层序遍历、先序遍历、中序遍历、后序遍历等,以下面的二叉树为例介绍遍历 E ...
  • wk199351
  • wk199351
  • 2017-03-25 12:48:35
  • 337

算法题目-二叉树前中后序遍历

转载自:https://blog.csdn.net/lynn_Kun/article/details/73222673前序:根-左-右中序:左-根-右后序:左-右-根实现:[java] view pl...
  • QQ317968200
  • QQ317968200
  • 2018-04-03 11:59:41
  • 3

二叉树的前中后序遍历

下面代码实现了二叉树的前中后序遍历,包括递归和非递归版本: package binaryTree; import java.util.*; /* * 二叉树的递归与非递归版本 */ publi...
  • Coding_Fox
  • Coding_Fox
  • 2016-04-20 18:50:56
  • 214

<em>二叉树</em>—<em>前中后</em>序遍历

实现<em>二叉树</em>的前序遍历,中序遍历,后续遍历,求出深度,总结点数,叶节点数... 实现<em>二叉树</em>的前序遍历,中序遍历,后续遍历,求出深度,总结点数,叶节点数 ...
  • 2018年04月06日 00:00

二叉树遍历 前中后

#include using namespace std;struct t{ int v; struct t * left; struct t * right;};void ...
  • u012063703
  • u012063703
  • 2015-12-28 09:22:10
  • 257

二叉树的前中后遍历

前序遍历:A B D H I E C F G J K 中序遍历:H D I B E A F C J G K 后序遍历:H I D E B F J K G C A...
  • dengshengjin2234
  • dengshengjin2234
  • 2013-01-30 11:23:37
  • 712

c++ 树或<em>二叉树</em>的<em>前中后</em>序查找实现

用c++ 实现树或<em>二叉树</em>的<em>前中后</em>序查找, 综合评分:0 收藏评论举报 所需: 3积分/C币 下载个数: 16 开通VIP 立即下载 评论共有0条 登录后才能评论 ...
  • 2018年04月06日 00:00

二叉树的建立及前中后序遍历

#include #include #include using namespace std; typedef struct BiNode { char data; struc...
  • WQJ0714
  • WQJ0714
  • 2015-11-27 21:25:37
  • 193
    个人资料
    等级:
    访问量: 862
    积分: 42
    排名: 183万+
    文章分类
    文章存档