劍指offer面試題7:重建二叉樹(java實現)
阿新 • • 發佈:2018-12-14
題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹,假設輸入的前序遍歷和中序遍歷的結果都不含重複的數字。例如:輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6}則重建二叉樹:其中二叉樹的定義如下:
* public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */
思路: 前序遍歷的第一個數字總是樹的根節點,在中序遍歷中,前序遍歷第一個值的左邊的數字位於根節點的左邊,右邊的數字位於根節點的右邊。以此類推:例如,由前序遍歷得出1是根節點,?️中序遍歷得出2,4,7在其左邊,3,5,6,8在其右邊。
奉上程式碼:
public class Solution { public TreeNode reConstructBinaryTree(int [] pre,int [] in) { TreeNode root = buildTree(pre,in,0,pre.length-1,0,in.length-1); return root; } public static TreeNode buildTree(int[] pre,int[] in,int startPre,int endPre,int startIn,int endIn){ if(startPre>endPre ||startIn>endIn){ return null; } TreeNode node = new TreeNode(pre[startPre]); for(int i=startIn;i<=endIn;i++){ if(in[i]==pre[startPre]){ int length = i-startIn; node.left =buildTree(pre,in,startPre+1,startPre+length,startIn,i-1); node.right = buildTree(pre,in,startPre+length+1,endPre,i+1,endIn); } } return node; } }