劍指offer-04:重建二叉樹
阿新 • • 發佈:2018-12-05
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{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