已知二叉樹前序,中序遍歷,求後序遍歷,java實現
阿新 • • 發佈:2019-01-06
簡單介紹一下思想,先看前序,前序遍歷的第一個節點,就是該樹的根。在中序中找到該根的位置,設為index,在中序遍歷集合中,位於index之前的屬於根的左子樹,位於index之後的屬於根的右子樹。然後,對左右子數,遍歷的呼叫該過程,就能將樹結構還原。之後後序遍歷也就不是問題了。
public class M { public static class Tree{ public int value; public Tree left; public Tree right; public Tree(int value) { this.value=value; } } public static void main(String[] args){ int[]preOrder={1,2,4,5,3,6,7}; int[]midOrder={4,2,5,1,6,3,7}; getBehindOrder(preOrder, midOrder); } public static void getBehindOrder(int[]pre,int[]mid){ if (pre==null||mid==null||pre.length!=mid.length) { return; } Tree root=buildTree(pre, mid); behindOrder(root); } public static void behindOrder(Tree root){//後序遍歷二叉樹 if (root==null) { return; } if (root.left!=null) { behindOrder(root.left); } if (root.right!=null) { behindOrder(root.right); } System.out.print(root.value+" "); } public static Tree buildTree(int[]preOrder,int[]midOrder){//根據前序和中序,建立二叉樹 int value=preOrder[0]; int length=preOrder.length; Tree root=new Tree(value); root.left=root.right=null; if (preOrder.length==1) { return root; } int index=0; while(midOrder[index]!=value) index++;//此處還要考慮index==length-1的情況 if (index>0) { //中序中,根節點左邊的節點都屬於左子樹 int[]leftSubPreOrder=new int[index]; for(int i=0;i<leftSubPreOrder.length;i++){ leftSubPreOrder[i]=preOrder[i+1]; } int[]leftSubMidOrder=new int[index]; for(int i=0;i<leftSubMidOrder.length;i++){ leftSubMidOrder[i]=midOrder[i]; } root.left=buildTree(leftSubPreOrder, leftSubMidOrder); } if(length-index-1>0){ int[]rightSubMidOrder=new int[length-index-1]; for(int i=0;i<rightSubMidOrder.length;i++){ rightSubMidOrder[i]=midOrder[i+index+1]; } int[]rightSubPreOrder=new int[length-index-1]; for(int i=0;i<rightSubPreOrder.length;i++){ rightSubPreOrder[i]=preOrder[i+index+1]; } root.right=buildTree(rightSubPreOrder, rightSubMidOrder); } return root; } }