一般的数据结构都有变量操作,根据需求的不同,二叉树一般有四种遍历方式:
1、先序遍历
如果二叉树为空,遍历结束,否则,第一步,访问根节点;第二步,先序遍历根节点的左子树,第三部,先序遍历根节点的右子树。
2、中序遍历
如果二叉树为空,遍历结束,否则,第一步,中序遍历根节点的左子树;第二步,访问根节点,第三部,中序遍历根节点的右子树。
3、后序遍历
如果二叉树为空,遍历结束,否则,第一步,后序遍历根节点的左子树;第二步,后序遍历根节点的右子树,第三部,访问根节点。
4、层次遍历
通过上面的理论可以总结出先序遍历和中序遍历来求解二叉树的过程,步骤如下:从二叉树的第一层(根结点)开始,从上至下逐层遍历,在同一层,则按从左到右的顺序对结点逐个访问。
a)确定树的根节点。树根是当前树中所有元素在先序遍历中最先出现的元素,即先序遍历的第一个结点就是二叉树的根。
b)求解树的子树。找到根在中序遍历的位置,位置左边是二叉树的左孩子,位置右边是二叉树的右子树,如果根节点左边或右边为空,那么该方向子树为空;如果根节点左边和右边都为空,那么根节点已经为叶子节点。
c)对二叉树的左、右孩子分别进行步骤a)、b),直到求出二叉树结构为止。
具体实现代码如下:
运行结果为:public class PostOreder__PreAndIN { public static void main(String[] args) { BinaryTree2 biTree=new BinaryTree2(); int[] pre={1,2,4,8,9,5,10,3,6,7}; int[] in={8,4,9,2,10,5,1,6,3,7}; biTree.initTree(pre, in); System.out.println("二叉树的后序遍历:"); biTree.postOrder2(); } } //定义节点的数据结构 class Node2{ public int data; public Node2 left; public Node2 right; public Node2(int data){ this.data=data; this.left=null; this.right=null; } } //定义一个二叉树 class BinaryTree2{ private Node2 root; public BinaryTree2(){ root=null; } //后序遍历方法递归实现 public void postOrder2(Node2 localRoot){ if(localRoot!=null){ postOrder2(localRoot.left); postOrder2(localRoot.right); System.out.print(localRoot.data+" "); } } public void postOrder2(){ this.postOrder2(this.root); } //初始化二叉树 public void initTree(int[] pre,int[] in){ this.root=this.initTree(pre, 0, pre.length-1, in, 0, in.length-1); } public Node2 initTree(int[] pre,int start1,int end1,int[] in,int start2,int end2){ if(start1>end1 ||start2>end2){ return null; } int rootData=pre[start1]; Node2 head=new Node2(rootData); //找到根节点所在的位置 int rootIndex=findIndexInArray(in,rootData,start2,end2); int offSet=rootIndex-start2-1; //构建左子树 Node2 left=initTree(pre, start1+1, start1+1+offSet, in, start2, start2+offSet); //构建右子树 Node2 right=initTree(pre, start1+1+offSet+1, end1, in, rootIndex+1, end2); head.left=left; head.right=right; return head; } public int findIndexInArray(int[] a,int x,int begin,int end){ for(int i=begin;i<=end;i++){ if(a[i]==x){ return i; } } return -1; } }
二叉树的后序遍历:
8 9 4 10 5 2 6 7 3 1