題目:
面試題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;
}
}
}