杨乐乐
Never too late

Follow

Never too late

Follow
Day 18 二叉树 - 找树左下角的值

Day 18 二叉树 - 找树左下角的值

杨乐乐's photo
杨乐乐
·Feb 1, 2023·

2 min read

Table of contents

  • 513. 找树左下角的值
  • 112. 路径总和
  • 113. 路径总和 ii
  • 106. 从中序与后序遍历序列构造二叉树
  • 105. 从前序与中序遍历序列构造二叉树

513. 找树左下角的值

function findBottomLeftValue(root: TreeNode | null): number {
    let res = 0;
    let queue = [root];
    while (queue.length) {
        const length = queue.length;
        let curRes = [];
        for (let i = 0; i < length; i++) {
            const node = queue.shift();
            curRes.push(node.val);
            node.left && queue.push(node.left);
            node.right && queue.push(node.right);
        };
        res = curRes[0];
    }
    return res;
};

112. 路径总和

function hasPathSum(root: TreeNode | null, targetSum: number): boolean {
    if (root === null) {
        return false;
    }
    let res = [];
    const getSum = (node: TreeNode | null, curSum: number) => {
        if (node.left === null && node.right === null) {
            curSum += node.val;
            res.push(curSum);
            return;
        };
        curSum += node.val;
        node.left && getSum(node.left, curSum);
        node.right && getSum(node.right, curSum);
    };
    getSum(root, 0);
    return res.includes(targetSum);
};

113. 路径总和 ii

function pathSum(root: TreeNode | null, targetSum: number): number[][] {
    let res = [];
    const dfs = (node: TreeNode | null, curSum: number, curPath: number[]) => {
        if (node === null) {
        return;
        }
        curSum += node.val;
        curPath.push(node.val);
        if (node.left === null && node.right === null) {
            if (curSum === targetSum) {
                res.push([...curPath]);
            }
            curPath.pop();
            return;
        };
        dfs(node.left, curSum, curPath);
        dfs(node.right, curSum, curPath);
        curPath.pop();
    };
    dfs(root, 0, []);
    return res;
};

106. 从中序与后序遍历序列构造二叉树

function buildTree(inorder: number[], postorder: number[]): TreeNode | null {
    if (!inorder.length) {
        return null;
    }
    let treeMid = postorder.pop();
    let treeMidIndex = inorder.indexOf(treeMid);
    const Tree = new TreeNode(treeMid);

    Tree.left = buildTree(inorder.slice(0, treeMidIndex), postorder.slice(0, treeMidIndex));

    Tree.right = buildTree(inorder.slice(treeMidIndex + 1), postorder.slice(treeMidIndex));

    return Tree;
};

105. 从前序与中序遍历序列构造二叉树

function buildTree(preorder: number[], inorder: number[]): TreeNode | null {
    if (!preorder.length) {
        return null;
    };

    let rootVal = preorder[0];
    let rootValIndex = inorder.indexOf(rootVal);
    const Tree = new TreeNode(rootVal);

    Tree.left = buildTree(preorder.slice(1, rootValIndex + 1), inorder.slice(0, rootValIndex));

    Tree.right = buildTree(preorder.slice(rootValIndex + 1), inorder.slice(rootValIndex + 1));

    return Tree;
};
 
Share this