题目:
面试题07. 重建二叉树
思路:
- 要明白先序遍历和中序遍历的具体顺序,
- 先找到先序遍历的第一个元素,然后再去中序遍历里面查找这个元素,得到这个元素在中序的索引,那么,在中序数组中,这个元素前面的元素都是这个元素的左子树结点,这个元素的右边都是这个元素的右子树结点。
- 对这个元素的左子树结点数组进行递归,
- 对这个元素的右子树结点数组进行递归。
实现:
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if (preorder == null || preorder.length == 0) {
return null;
}
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
int len = preorder.length;
for (int i = 0; i < len; i++) {
map.put(inorder[i], i);
}
TreeNode root = buildTree(preorder, 0, len - 1, inorder, 0, len - 1, map);
return root;
}
public TreeNode buildTree(int[] preorder, int preStart, int preEnd, int[] inorder, int inStart, int inEnd, Map<Integer, Integer> map) {
if (preStart > preEnd) return null;
int rootVal = preorder[preStart];
TreeNode rootNode = new TreeNode(rootVal);
if (preStart == preEnd)
return rootNode;
else {
int rootIndex = map.get(rootVal);
int leftNodes = rootIndex - inStart;
int rightNodes = inEnd - rootIndex;
TreeNode leftTree = buildTree(preorder, preStart + 1, preStart + leftNodes, inorder, inStart, rootIndex - 1, map);
TreeNode rightTree = buildTree(preorder, preEnd - rightNodes + 1, preEnd, inorder, rootIndex + 1, inEnd, map);
rootNode.left = leftTree;
rootNode.right = rightTree;
return rootNode;
}
}
}