重建二叉树
重建二叉树
题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
题目思路:
一、递归
- 前序遍历第一个是根节点。
- 根据根节点可以在中序遍历中找到该节点的位置
- 中序遍历根节点位置左边的所有节点都是左子树的节点,右边的节点都是右子树的节点。
- 然后根据左右两边各有多少个节点数目,在前序遍历中可以划分出[根节点|左子树|右子树].
- 然后递归在左右子树中重建二叉树。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if (preorder == null || preorder.length == 0) {
return null;
}
//Map用来存放中序遍历中根节点的位置,方便查找,查找为0(1)
Map<Integer, Integer> indexMap = new HashMap<Integer, Integer>();
int length = preorder.length;
for (int i = 0; i < length; i++) {
indexMap.put(inorder[i], i);
}
TreeNode root = buildTree(preorder, 0, length - 1, inorder, 0, length - 1, indexMap);
return root;
}
public TreeNode buildTree(int[] preorder, int preorderStart, int preorderEnd, int[] inorder, int inorderStart, int inorderEnd, Map<Integer, Integer> indexMap) {
if (preorderStart > preorderEnd) {
return null;
}
//前序遍历的第一个节点就是根节点
int rootVal = preorder[preorderStart];
TreeNode root = new TreeNode(rootVal);
if (preorderStart == preorderEnd) {
return root;
} else {
//获取根节点的位置
int rootIndex = indexMap.get(rootVal);
//计算中序遍历中根节点左边的节点数,即左子树的节点数字,还有右边同理。
int leftNodes = rootIndex - inorderStart, rightNodes = inorderEnd - rootIndex;
//递归构建左子树
TreeNode leftSubtree = buildTree(preorder, preorderStart + 1, preorderStart + leftNodes, inorder, inorderStart, rootIndex - 1, indexMap);
//递归构建右子树
TreeNode rightSubtree = buildTree(preorder, preorderEnd - rightNodes + 1, preorderEnd, inorder, rootIndex + 1, inorderEnd, indexMap);
root.left = leftSubtree;
root.right = rightSubtree;
return root;
}
}
}

浙公网安备 33010602011771号