码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树的先序、中序、后序遍历

时间:2016-07-22 12:48:36      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:

  二叉树的遍历方法有多种,首先我想先改变这几个遍历的名字(前根序遍历,中根序遍历,后根序遍历);前中后本来就是相对于根结点来说的,少一个字会产生很多不必要的误解。

 技术分享

  先简单描述一下这三种遍历方法的区别:

  1. 先序遍历:先遍历根结点,然后遍历左子树,最后遍历右子树。上图中的先序遍历结果是ABDHECFG
  2. 中序遍历:先遍历左子树,然后遍历根结点,最后遍历右子树。上图中的中序遍历结果是HDBEAFCG
  3. 后序遍历:先遍历左子树,然后遍历右子树,最后遍历根节点。上图中的后序遍历结果是HDEBFGCA

先序遍历:

  递归方式:

 1 //前序遍历
 2     public void PreOrder(BinaryTreeNode<E> root){
 3         if(root == null)
 4             return  ;
 5         else{
 6             System.out.print(root+" ");
 7             PreOrder(root.lchild) ;
 8             PreOrder(root.rchild) ;
 9         }
11     }

 

非递归方式:借用栈的结构特点来实现,具体步骤如下:

  1. 首先申请一个栈,记为stack
  2. 然后将头结点压入stack中
  3. 每次从stack中弹出栈顶元素,记为cur,然后打印cur节点的值。如果cur右孩子不为空的话,将cur的右孩子先压入stack中,最后如果cur的做孩子不为空的话将cur的做孩子压入栈stack中
  4. 不断重复步骤3,直到stack为空,全部过程结束。

 

 

中序遍历:

  递归方式:

 1 //中序遍历
 2     public void MidOrder(BinaryTreeNode<E> root){
 3         if(root == null)
 4             return  ;
 5         else{
 6             MidOrder(root.lchild) ;
 7             System.out.print(root+" ");            
 8             MidOrder(root.rchild) ;
 9         }
10     }

  非递归方式:也是借用栈的结构特点来实现,具体步骤如下:

  1. 申请一个新的栈,记为stack,申请一个变量cur,初始时令cur等于头结点
  2. 先把cur节点压入栈中,对以cur节点为头的整棵子树来说,依次把整棵树的左子树压入栈stack中,及不断令cur = cur.left,然后重复步骤2
  3. 不断重复步骤2,知道发现cur为空,此时从stack中弹出一个节点,记为node,打印node的值,并让cur = node.right,然后继续重复步骤2。

 

后序遍历:

  递归方式:

 1 //后序遍历
 2     public void LastOrder(BinaryTreeNode<E> root){
 3         if(root == null)
 4             return  ;
 5         else{
 6             LastOrder(root.lchild) ;
 7             LastOrder(root.rchild) ;            
 8             System.out.print(root+" ");            
 9         }
10     }

  非递归方式:也是借用栈的结构特点来实现,具体步骤如下:

  1. 申请一个栈,记为stack,将头结点压入stack,同时设置两个变量h和cur,在整个流程中,h代表最近一次弹出并打印的节点,cur代表当前stack的栈顶节点,初始时令h为头结点,cur为null;
  2. 每次令cur等于当前stack的栈顶元素,但是补充stack中弹出节点,此时分为以下三种情况判断是否弹出元素:
    1. 如果cur的做孩子不为null,并且h不等于cur的左孩子,也不等于cur的右孩子,则把cur的左孩子压入栈stack中
    2. 如果情况1不成立,并且cur的右孩子不为null,并且h不等于cur的右孩子,则把cur的右孩子压入栈stack中
    3. 如果情况1和2都不成立,则从stack中弹出cur元素并打印,然后令h等于cur
  3. 一直重复步骤2,直到stack为空并且cur为空,过程停止

 

 

根据遍历结果构造二叉树

根据遍历结果我们可以构造出原始的二叉树,在此过程中我们只能通过二叉树的先序+中序中序+后序来构造:

已知一棵二叉树的先序序列和中序序列,构造该二叉树的过程如下:

  1. 根据前根序序列的第一个元素建立根结点;
  2. 在中根序序列中找到该元素,确定根结点的左右子树的中根序序列;
  3. 在前根序序列中确定左右子树的前根序序列;
  4. 由左子树的前根序序列和中根序序列建立左子树;
  5. 由右子树的前根序序列和中根序序列建立右子树。

已知一棵二叉树的后序序列和中序序列,构造该二叉树的过程如下:

  1. 根据后根序序列的最后一个元素建立根结点;
  2. 在中根序序列中找到该元素,确定根结点的左右子树的中根序序列;
  3. 在后根序序列中确定左右子树的后根序序列;
  4. 由左子树的后根序序列和中根序序列建立左子树;
  5. 由右子树的后根序序列和中根序序列建立右子树。

 

二叉树的先序、中序、后序遍历

标签:

原文地址:http://www.cnblogs.com/mukekeheart/p/5694560.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!