题目:重建二叉树
思路:
对于前序遍历,根节点必定第一个出现;
对于中序遍历,根节点的左子树的所有结点必定在根节点的左侧,右子树的所有结点必定在根节点的右侧。
代码:
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
import java.util.*;
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if (pre.length == 0) {
return null;
}
return backtrack(pre, in, 0, pre.length - 1, 0, in.length - 1);
}
public TreeNode backtrack(int [] pre,int [] in, int preStart, int preEnd, int inStart, int inEnd) {
if (preStart > preEnd) {
return null;
}
TreeNode root = new TreeNode(pre[preStart]);
// 找到根节点在中序的位置
int rootIdx = search(in, inStart, inEnd, pre[preStart]);
// 找到左子树长度
int len = rootIdx - inStart;
root.left = backtrack(pre, in, preStart + 1, preStart + len, inStart, rootIdx - 1);
root.right = backtrack(pre, in, preStart + len + 1, preEnd, rootIdx + 1, inEnd);
return root;
}
public int search(int[] num, int inStart, int inEnd, int target) {
for (int i = inStart; i <= inEnd; i++) {
if (num[i] == target) {
return i;
}
}
return -1;
}
}