题目:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
题目思路:
前序遍历【根节点,左,右】
中序遍历【左,根节点,右】
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
所以,3是
MAP
Object get(Object k)
返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
Object put(Object k, Object v)
将指定的值与此映射中的指定键关联(可选操作)
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if(preorder==null)
{
return null;
}
Map<Integer,Integer>indexMap =new HashMap<Integer, Integer>();
int length=preorder.length;
for(int i=0;i<length;i++)
{
//将中序遍历放进map中
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 {
//得到根节点的坐标位置,比如根节点3的 rootIndex为1
int rootIndex = indexMap.get(rootVal);
int leftNodes = rootIndex - inorderStart;
int 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;
}
}
}