关闭

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

标签: java二叉树遍历迭代算法
637人阅读 评论(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);
			}
		}
}


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

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


   
2
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

二叉树前序,中序,后序遍历迭代实现详解

二叉树的遍历迭代实现 在上一篇文章中实现了二叉树,但是对于遍历仅仅是简单的用递归来进行了实现。在这篇文章中将给出迭代的实现版本以及分析过程。 首先给出我们要分析的二叉树实例: 前序遍历迭...
  • u014787113
  • u014787113
  • 2015-11-08 13:05
  • 1914

实现二叉树的先序遍历、中序遍历、后序遍历的递归非递归算法以及层次遍历算法

#include"iostream" #define maxsize 50 using namespace std; class node{ private: char data; node* l...
  • u012651730
  • u012651730
  • 2013-11-19 22:42
  • 1284

二叉树的遍历详解(前序中序后序层次-递归和非递归)

二叉树二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不...
  • gatieme
  • gatieme
  • 2016-04-15 17:04
  • 6505

二叉树模板 先中后序遍历,非递归算法,层次遍历,叶子结点数,深度

二叉树模板
  • qq_39531685
  • qq_39531685
  • 2017-11-21 19:32
  • 42

Binary Tree Postorder Traversal 二叉树的后序遍历(迭代非递归版本)

下面来讲讲迭代版本的二叉树后序遍历。 首先,我们先来造一个二叉树,先自己模拟一下后序遍历。 为了便于理解,我在之前的中序遍历的树上进行了扩展。
  • qiexingqieying
  • qiexingqieying
  • 2016-06-08 14:08
  • 309

Java迭代实现二叉树的前序、中序、后序遍历

我们都知道,二叉树的遍历有三种形式:前序遍历、中序遍历、后序遍历,三种遍历的规则分别如下: 1)前序遍历:先遍历根节点,然后遍历左子节点,最后遍历右子节点,简记为“根-左-右”; 2)中序遍历:先...
  • yangfeisc
  • yangfeisc
  • 2015-03-20 21:06
  • 2052

二叉树的创建以及利用迭代实现中序、先序、后序遍历、清空

/* 二叉链表就是以链表为存储结构存储二叉树 ,我么要像编号 完全二叉树一样 存储 普通的二叉树 。 节点的声明如下 node     */ #include using namespace s...
  • yue7603835
  • yue7603835
  • 2012-04-30 23:01
  • 3402

二叉树的前序、中序、后序遍历—迭代方法

leetcode上的相关题目: 前序:https://leetcode.com/problems/binary-tree-preorder-traversal/?tab=Description 中...
  • u011567017
  • u011567017
  • 2017-02-25 11:35
  • 900

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

  • 2010-07-13 10:15
  • 78KB
  • 下载

二叉树遍历算法 (递归的、非递归的中序、前序、后序遍历 和 层次遍历 以及 求二叉树的宽度和深度)

  • 2015-09-22 16:44
  • 158KB
  • 下载
    个人资料
    • 访问:785次
    • 积分:40
    • 等级:
    • 排名:千里之外
    • 原创:3篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档