二叉树的遍历方法有多种,首先我想先改变这几个遍历的名字(前根序遍历,中根序遍历,后根序遍历);前中后本来就是相对于根结点来说的,少一个字会产生很多不必要的误解。
先简单描述一下这三种遍历方法的区别:
- 先序遍历:先遍历根结点,然后遍历左子树,最后遍历右子树。上图中的先序遍历结果是ABDHECFG
- 中序遍历:先遍历左子树,然后遍历根结点,最后遍历右子树。上图中的中序遍历结果是HDBEAFCG
- 后序遍历:先遍历左子树,然后遍历右子树,最后遍历根节点。上图中的后序遍历结果是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 }
非递归方式:借用栈的结构特点来实现,具体步骤如下:
- 首先申请一个栈,记为stack
- 然后将头结点压入stack中
- 每次从stack中弹出栈顶元素,记为cur,然后打印cur节点的值。如果cur右孩子不为空的话,将cur的右孩子先压入stack中,最后如果cur的做孩子不为空的话将cur的做孩子压入栈stack中
- 不断重复步骤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 }
非递归方式:也是借用栈的结构特点来实现,具体步骤如下:
- 申请一个新的栈,记为stack,申请一个变量cur,初始时令cur等于头结点
- 先把cur节点压入栈中,对以cur节点为头的整棵子树来说,依次把整棵树的左子树压入栈stack中,及不断令cur = cur.left,然后重复步骤2
- 不断重复步骤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 }
非递归方式:也是借用栈的结构特点来实现,具体步骤如下:
- 申请一个栈,记为stack,将头结点压入stack,同时设置两个变量h和cur,在整个流程中,h代表最近一次弹出并打印的节点,cur代表当前stack的栈顶节点,初始时令h为头结点,cur为null;
- 每次令cur等于当前stack的栈顶元素,但是补充stack中弹出节点,此时分为以下三种情况判断是否弹出元素:
- 如果cur的做孩子不为null,并且h不等于cur的左孩子,也不等于cur的右孩子,则把cur的左孩子压入栈stack中
- 如果情况1不成立,并且cur的右孩子不为null,并且h不等于cur的右孩子,则把cur的右孩子压入栈stack中
- 如果情况1和2都不成立,则从stack中弹出cur元素并打印,然后令h等于cur
- 一直重复步骤2,直到stack为空并且cur为空,过程停止
根据遍历结果构造二叉树
根据遍历结果我们可以构造出原始的二叉树,在此过程中我们只能通过二叉树的先序+中序或中序+后序来构造:
已知一棵二叉树的先序序列和中序序列,构造该二叉树的过程如下:
- 根据前根序序列的第一个元素建立根结点;
- 在中根序序列中找到该元素,确定根结点的左右子树的中根序序列;
- 在前根序序列中确定左右子树的前根序序列;
- 由左子树的前根序序列和中根序序列建立左子树;
- 由右子树的前根序序列和中根序序列建立右子树。
已知一棵二叉树的后序序列和中序序列,构造该二叉树的过程如下:
- 根据后根序序列的最后一个元素建立根结点;
- 在中根序序列中找到该元素,确定根结点的左右子树的中根序序列;
- 在后根序序列中确定左右子树的后根序序列;
- 由左子树的后根序序列和中根序序列建立左子树;
- 由右子树的后根序序列和中根序序列建立右子树。
时间: 2024-12-28 11:44:04