个人算法成长之路四十五!!!定期更新一些刷题过程中个人的思路以及理解。有兴趣的朋友们可以互动交流哈~
题目:
105. 从前序与中序遍历序列构造二叉树
给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
示例 1:
输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]
示例 2:
输入: preorder = [-1], inorder = [-1]
输出: [-1]
解题思路:
- 构造二叉树,第一件事一定是找根节点,然后想办法构造左右子树。
- 肯定要想办法确定根节点的值,把根节点找出来,然后递归构造左右子树即可
- 前序遍历的第一个值preorder[0]就是根节点的值,在中序序列中查找根节点所在位置,找到了位置,此位置之前的就是左子树,此位置之后的就是右子树,递归即可
/**
* @param {number[]} preOrder
* @param {number[]} inOrder
* @return {TreeNode}
*/
var buildTree = function (preOrder, inOrder) {
const build = (preStart, preEnd, inStart, inEnd) => {
if (preStart > preEnd) return null;
// root 节点对应的值就是前序遍历数组的第一个元素
let rootVal = preOrder[preStart];
// rootVal 在中序遍历数组中的索引
let index = inOrder.indexOf(rootVal);
// 左子树个数
let leftSize = index - inStart;
// 先构造出当前根节点
let root = new TreeNode(rootVal);
// 递归构造左右子树
root.left = build(preStart + 1, preStart + leftSize, inStart, index - 1);
root.right = build(preStart + leftSize + 1, preEnd, index + 1, inEnd);
return root;
};
return build(0, preOrder.length - 1, 0, inOrder.length - 1);
};