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