题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
分析
前序遍历的第一个值为根节点的值,使用这个值将中序遍历结果分成两部分,左部分为树的左子树中序遍历结果,右部分为树的右子树中序遍历的结果。
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode reConstructBinaryTree(int [] preOrder , int [] inOrder) {
int pLen = preOrder.length;
int iLen = inOrder.length;
if(pLen == 0 && iLen == 0) return null;
return helper(preOrder , inOrder , 0 , pLen-1 , 0 , iLen-1);
}
public TreeNode helper(int [] preOrder , int [] inOrder , int pStart , int pEnd, int iStart , int iEnd) {
TreeNode tree = new TreeNode(preOrder[pStart]);
tree.left = null;
tree.right = null;
if(pStart == pEnd && iStart == iEnd) {
return tree;
}
int root = 0;
for(root = iStart; root < iEnd; root++) {
if(preOrder[pStart] == inOrder[root]) {
break;
}
}
int leftLength = root - iStart;
int rightLength = iEnd - root;
if(leftLength > 0) {
tree.left = helper(preOrder, inOrder, pStart+1, pStart+leftLength, iStart, root-1);
}
if(rightLength > 0) {
tree.right = helper(preOrder, inOrder, pStart+leftLength+1, pEnd, root+1, iEnd);
}
return tree;
}
}