题目描述:
给定节点数为 n 二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。
思路:从中序遍历结果中找到前序遍历结果的第一个数,这个数在中序遍历结果中的位置假设为p,则p为根节点,中序遍历结果中p的左边为p的左子树,p的右边为p的右子数。可以自己画图看一下就知道了。
代码实现如下:
写法一:
class Solution {
public int pi = 0;
public int findIndex(int[] preorder,int[] inorder,int begin,int end) {
for (int i = 0;i <= end; i ++) {
if (inorder[i] == preorder[pi]) return i;
}
return -1;
}
public TreeNode buildTreeChild (int[] preorder,int[] inorder,int begin,int end) {
if (begin > end) return null;
TreeNode root = new TreeNode(preorder[pi]);
int mi = findIndex(preorder,inorder,begin,end);
pi ++;
root.left = buildTreeChild(preorder,inorder,begin,mi - 1);
root.right = buildTreeChild(preorder,inorder,mi + 1,end);
return root;
}
public TreeNode buildTree(int[] preorder, int[] inorder) {
return buildTreeChild(preorder,inorder,0,inorder.length - 1);
}
}
写法二:
public class Solution {
public TreeNode reConstructBinaryTreeH(int [] pre,int ps,int pe, int [] vin,int vs,int ve) {
if (ps > pe || vs > ve) return null;
TreeNode root = new TreeNode(pre[ps]);
int i = vs;
for (;i <= ve;i++) {
if (vin[i] == pre[ps]) {
root.left = reConstructBinaryTreeH(pre,ps + 1,i - vs + ps,vin,vs,i - 1);
root.right = reConstructBinaryTreeH(pre,i - vs + ps + 1,pe,vin,i + 1,ve);
break;
}
}
return root;
}
public TreeNode reConstructBinaryTree(int [] pre,int [] vin) {
if (pre.length == 0 || vin.length == 0) return null;
return reConstructBinaryTreeH(pre,0,pre.length - 1,vin,0,vin.length - 1);
}
}