拿preorder+inorder为例。
1. preorder的第一个数必然是根节点
2. 在inorder数组中查找这个数,得到rootIndex
3. rootIndex左边的数组即为left child node,右边的数组right node
4. 左右数组分别递归。
// Construct Binary Tree from Preorder and InorderTraversal
public class Solution {
public TreeNodebuildTree(int[] preorder, int[] inorder) {
// Start typing your Java solution below
// DO NOT write main() function
return helper(preorder, 0, preorder.length-1,inorder, 0, inorder.length-1);
}
TreeNode helper(int[]preorder, int preLow, int preHigh, int[] inorder, int inLow, intinHigh) {
if (preLow > preHigh) {
returnnull;
}
if (preLow == preHigh) {
return newTreeNode(preorder[preLow]);
}
int rootNum = preorder[preLow];
int rootNumInorderIndex = search(inorder, inLow,inHigh+1, rootNum);
int len = rootNumInorderIndex - inLow;
TreeNode result = new TreeNode(rootNum);
result.left = helper(preorder, preLow+1, preLow+ len,
inorder, inLow, rootNumInorderIndex-1);
result.right = helper(preorder, preLow + len +1,preHigh,
inorder, rootNumInorderIndex + 1, inHigh);
return result;
}
int search(int[] arr,int low, int high, int target) {
for (int i = low; i < high; i++){
if (arr[i]== target) {
return i;
}
}
return -1;
}
}
// Construct Binary Tree from Inorder and PostorderTraversal
public class Solution {
public TreeNodebuildTree(int[] inorder, int[] postorder) {
return helper(postorder, 0, postorder.length-1,inorder, 0, inorder.length-1);
}
TreeNode helper(int[]postorder, int preLow, int preHigh, int[] inorder, int inLow, intinHigh) {
if (preLow > preHigh) {
returnnull;
}
if (preLow == preHigh) {
return newTreeNode(postorder[preLow]);
}
int rootNum = postorder[preHigh];
int rootNumInorderIndex = search(inorder, inLow,inHigh+1, rootNum);
int len = rootNumInorderIndex - inLow;
TreeNode result = new TreeNode(rootNum);
result.left = helper(postorder, preLow, preLow +len -1,
inorder, inLow, rootNumInorderIndex-1);
result.right = helper(postorder, preLow + len,preHigh -1,
inorder, rootNumInorderIndex + 1, inHigh);
return result;
}
int search(int[] arr,int low, int high, int target) {
for (int i = low; i < high; i++){
if (arr[i]== target) {
return i;
}
}
return -1;
}
}