“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 九 天,点击查看活动详情”
剑指 Offer 07. 重建二叉树
assets.leetcode.com/uploads/202…
力扣连接剑指 Offer 07. 重建二叉树 - 力扣(Leetcode)
解题思路:
先通过先序遍历的第一个结点找到根节点,此节点非常重要也非常好找,
第一个值,那渠道这个值之后我们就用它在中序遍历中去找其位置也就是索引,因为根节点只可能有一个,
所以找到中序遍历中结点的序号,其之前的就自然是左子树,右边的自然右子树,
那么在先序遍历中由于左子树的序号其实就是其长度加一个根节点+1,
在中序遍历中我们找到的左子树最后一个序号应该是根节点-1,
例如root - 1,那么先序遍历中最后一个结点就是root,那么其右子树就是从root+1开始到最后。
使用到的函数slice
从第一个参数开始截止到第二个参数,左闭右开。
在js中new 对象不需要像java中类型匹配,我们都定义成const/let/var
最后返回root
程序运行过程:
先判断是否到达结束位置,如果到了就返回
然后进行取值判断,子节点的递归,这里注意递归就是不停的进行你写的函数,
程序可以理解卡在那里,不停递归,
直至走到最上面的判空语句,
返回,这里就会开始回溯,不停回溯,也就是将最后一行返回根节点进行执行返回给其父函数,也就是递归他的上一个函数值,
不停的赋值给它,一层一层直至到达根节点。
这里函数只需要返回二叉树根节点,无需进行额外的后序遍历,注意审题
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {number[]} preorder
* @param {number[]} inorder
* @return {TreeNode}
*/
var buildTree = function(preorder, inorder) {
if(!preorder.length || !inorder.length)
{
return null
}
const rootValue = preorder[0];
let pindex = inorder.indexOf(rootValue);
const root = new TreeNode(rootValue);
root.left = buildTree(preorder.slice(1,pindex+1),inorder.slice(0,pindex));
root.right = buildTree(preorder.slice(pindex+1),inorder.slice(pindex+1));
return root
};