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

文章目录

  • 2236. 判断根结点是否等于子结点之和
    • 题目链接
    • 思路
    • 题解
  • 面试题 04.10. 检查子树
    • 题目链接
    • 思路
    • 题解
  • 面试题 04.06. 后继者
    • 题目链接
    • 思路
    • 题解
  • 1110. 删点成林
    • 题目链接
    • 思路
    • 题解


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
};

你可能感兴趣的:(五月集训,面试,leetcode,算法,数据结构)