题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
解题思路
首先通过前序遍历确定根节点,在中序遍历中确定左右分支。如上面的例子,通过前序遍历的第一个节点知道根节点是1,通过中序遍历知道左分支是4,7,2右分支是5,3,8,6。接着递归调用,确定左分支的根节点和右分支的根节点。
关键是对前序遍历和后序遍历确定左右分支的范围。
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public class chongjianerchashu {
public TreeNode buildTree(int[] pre, int[] in, int preStart, int preEnd, int inStart, int inEnd) {
int rootIndex = 0;
for (int i = inStart; i <= inEnd; i++) {
if (in[i] == pre[preStart]) {
rootIndex = i;
break;
}
}
TreeNode node = new TreeNode(in[rootIndex]);
int lDis = rootIndex - inStart;// 元素个数
int rDis = inEnd - rootIndex;
if (lDis > 0)
node.left = buildTree(pre, in, preStart + 1, preStart + lDis, inStart, rootIndex - 1);
if (rDis > 0)
node.right = buildTree(pre, in, preEnd - rDis + 1, preEnd, rootIndex + 1, inEnd);
return node;
}
public TreeNode reConstructBinaryTree(int[] pre, int[] in) {
if (pre == null || in == null || pre.length == 0 || in.length == 0 || pre.length != in.length)
return null;
return buildTree(pre, in, 0, pre.length - 1, 0, in.length - 1);
}
public static void main(String[] args) {
new chongjianerchashu().reConstructBinaryTree(new int[] { 1, 2, 4, 7, 3, 5, 6, 8 },
new int[] { 4, 7, 2, 1, 5, 3, 8, 6 });
}
}