/**
* 1、前序给我们带来什么,一下子能知道根是谁,
* 2、中序给我们什么,通过根 知道左子树的结束点在哪里,右子树开始在哪里
* <p> 3
* 9 20
* 15 7
* <p> 输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
* todo :所以算法就是不断的执行递归函数:
*/
class Solution {
int[] preorder;
HashMap<Integer, Integer> dic = new HashMap<>();
public TreeNode buildTree(int[] preorder, int[] inorder) {
this.preorder = preorder;
for (int i = 0; i < inorder.length; i++)
dic.put(inorder[i], i);
return recur(0, 0, inorder.length - 1);
}
TreeNode recur(int root, int left, int right) {
if (left > right) return null; // 递归终止
TreeNode node = new TreeNode(preorder[root]); // 建立根节点
int i = dic.get(preorder[root]); // 划分根节点、左子树、右子树
node.left = recur(root + 1, left, i - 1); // 开启左子树递归
node.right = recur(root + i - left + 1, i + 1, right); // 开启右子树递归 // todo root+(index -left)+ 1
return node; // 回溯返回根节点
}
}
Hot100【五十一】: 105. 从前序与中序遍历序列构造二叉树
于 2024-04-23 07:59:24 首次发布