算法记录
LeetCode 题目:
给定一棵树的前序遍历 preorder 与中序遍历 inorder。请构造二叉树并返回其根节点。
说明
一、题目
Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]
二、分析
- 简单的根据前序和中序构建二叉树问题。
- 因为二叉树的定义是递归的,所以其构建也可以是递归进行的。
- 前序遍历的第一个节点肯定是当前需要构建二叉树的根节点,也就是可以先确定二叉树的根节点。
- 而二叉树的中序遍历前半段是左子树的节点,右半段是右子树的节点,以根节点进行划分。
- 就可以先将根节点构建出来,然后再根据中序遍历的节点划分来递归的创建该节点的左右子树。
- 这里可以采用一个存储索引的方式来快速的找到根节点在中序遍历中的位置信息,方便定位到左右子树的方位区间。
class Solution {
private Map<Integer, Integer> index;
public TreeNode build(int[] preorder, int preL, int preR, int[] inorder, int ordL, int ordR) {
if(preL > preR) return null;
TreeNode root = new TreeNode(preorder[preL]);
int pos = index.get(preorder[preL]);
int len = pos - ordL;
root.left = build(preorder, preL + 1, preL + len, inorder, ordL, pos - 1);
root.right = build(preorder, preL + 1 + len, preR, inorder, pos + 1, ordR);
return root;
}
public TreeNode buildTree(int[] preorder, int[] inorder) {
index = new HashMap();
for(int i = 0; i < inorder.length; i++)
index.put(inorder[i], i);
return build(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
}
}
总结
熟悉根据二叉树的前序遍历和中序遍历还原二叉树的方法。