1. 程式人生 > >劍指offer-04:重建二叉樹

劍指offer-04:重建二叉樹

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。

public class Solution04 {


    public TreeNode reConstructBinaryTree(int[] pre, int[] in) {
        TreeNode root = reConstructBinaryTree(pre, 0, pre.length - 1, in, 0, in.length -
1); return root; } //前序遍歷{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6} private TreeNode reConstructBinaryTree(int[] pre, int startPre, int endPre, int[] in, int startIn, int endIn) { if (startPre > endPre || startIn > endIn) return null; TreeNode root =
new TreeNode(pre[startPre]); for (int i = startIn; i <= endIn; i++) if (in[i] == pre[startPre]) { root.left = reConstructBinaryTree(pre, startPre + 1, startPre + i - startIn, in, startIn, i - 1); root.right = reConstructBinaryTree(pre, i - startIn +
startPre + 1, endPre, in, i + 1, endIn); } return root; } public static void main(String[] args) { int[] pre={1,2,4,7,3,5,6,8}; int[] in={4,7,2,1,5,3,8,6}; TreeNode tree=new Solution04().reConstructBinaryTree(pre,in); new Solution04().print(tree,tree.val,0); } private void print(TreeNode tree, int key, int direction) { if(tree != null) { if(direction==0) // tree是根節點 System.out.printf("%2d is root\n", tree.val, key); else // tree是分支節點 System.out.printf("%2d is %2d's %6s child\n", tree.val, key, direction==1?"right" : "left"); print(tree.left, tree.val, -1); print(tree.right,tree.val, 1); } } }

列印結果:

 1 is root
 2 is  1's   left child
 4 is  2's   left child
 7 is  4's  right child
 3 is  1's  right child
 5 is  3's   left child
 6 is  3's  right child
 8 is  6's   left child