【五月集训】第十八天打卡(树)


2236. 判断根结点是否等于子结点之和

题目链接

判断根结点是否等于子结点之和

思路

判断树的左右节点值相加是否等于根节点值

题解

/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */

function checkTree(root: TreeNode | null): boolean {
    return root.val == root.left.val + root.right.val
};

面试题 04.10. 检查子树

题目链接

检查子树

思路

  • 利用后续遍历重新计算树的值
  • 计算t1和t2的哈希值,然后去t1树上找计算后的值,有则表明存在这棵子树

题解

function calcHash(t: TreeNode | null) {
    if (!t) return
    calcHash(t.left)
    calcHash(t.right)
    let l = t.left?.val ?? 12743101
    let r = t.right?.val ?? 71113191
    t.val = t.val * 2120101 + l * 21007 + r * 1
}
function find(root: TreeNode | null, val) {
    if (!root) return false
    return (root.val == val) || find(root.left, val) || find(root.right, val)
}
function checkSubTree(t1: TreeNode | null, t2: TreeNode | null): boolean {
    calcHash(t1)
    calcHash(t2)
    console.log(t1,t2)
    if (!t2) return true
    return find(t1, t2.val)
};

面试题 04.06. 后继者

题目链接

后继者

思路

记录一个flag和一个节点ret,初始化flag为false,ret为null,然后中序遍历数,如果发现树根节点等于p,flag=true,如果false为true且ret为null,将当前节点赋值给ret

题解

var inorderSuccessor = function (root, p) {
    let flag = false
    let ret = null
    /** 中序遍历 */
    function dfs(root, p) {
        if (!root) return
        dfs(root.left, p)
        if (flag && !ret) ret = root
        if (root == p) flag = true
        dfs(root.right, p)
    }

    dfs(root, p)
    return ret
};

1110. 删点成林

题目链接

删点成林

思路

  • 后续遍历记录当前节点的父节点
  • 如果节点在删除列表中,断父子关系,将左子树和右子树塞入结果列表
  • 后续遍历完且根节点不在删除列表,将跟节点放入结果列表

题解

function delNodes(root: TreeNode | null, to_delete: number[]): Array<TreeNode | null> {
    let hash = {}
    let ret: TreeNode[] = []
    function dfs(parent: TreeNode | null, isleft: boolean, root: TreeNode | null) {
        if (!root) return
        dfs(root, true, root.left)
        dfs(root, false, root.right)

        if (hash[root.val]) {
            if (parent) {
                parent[isleft ? 'left' : 'right'] = null
            }
            if (root.left) ret.push(root.left)
            if (root.right) ret.push(root.right)
        }
    }

    if (!root) return
    let i: number
    for (i = 0; i < to_delete.length; ++i) {
        hash[to_delete[i]] = 1
    }
    dfs(null, false, root)
    if (!hash[root.val]) ret.unshift(root)
    return ret
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值