题目描述:
根据一棵树的前序遍历与中序遍历构造二叉树。
示例:
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
先序遍历的顺序是根节点、左子树、右子树;中序遍历的顺序是左子树,根节点,右节点。所以我们需要根据先序遍历得到根节点,然后在中序遍历中找到根节点的位置,它的左边就是左子树,右边就是右子树。生成左子树和右子树之后就可以递归的进行了。
Java代码:
/**
* 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) {
//使用HashMap将中序遍历数组的每个元素的下标和值存起来,方便查找根节点
HashMap<Integer, Integer> map = new HashMap<>();
for(int i = 0;i < inorder.length;i++) {
map.put(inorder[i], i);
}
return buildTreeHelper(preorder, 0, preorder.length, inorder, 0, inorder.length, map);
}
private TreeNode buildTreeHelper(int[] preorder, int p_start, int p_end, int[] inorder, int i_start, int i_end, HashMap<Integer, Integer> map) {
if(p_start == p_end) return null;
int root_val = preorder[p_start];
TreeNode root = new TreeNode(root_val);
//寻找根节点
int i_root_index = map.get(root_val);
int left_num = i_root_index - i_start;
//递归构造左子树
root.left = buildTreeHelper(preorder, p_start + 1, p_start +left_num + 1, inorder,
p_start, i_root_index, map);
//递归构造右子树
root.right = buildTreeHelper(preorder, p_start + left_num + 1, p_end, inorder,
i_root_index + 1, i_end, map);
return root;
}
}
网友评论