572. 另一个树的子树

给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。

链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/**
* 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 isSame(treeA: TreeNode | null, treeB: TreeNode | null): boolean {
if (treeA === null && treeB === null) return true
if (
(treeA === null && treeB !== null) ||
(treeA !== null && treeB === null)
) return false
return treeA.val === treeB.val && isSame(treeA.left, treeB.left) && isSame(treeA.right, treeB.right)
}

function isSubtree(root: TreeNode | null, subRoot: TreeNode | null): boolean {
let res = false
function traverse(node: TreeNode | null) {
if (node === null) return
if (node.val === subRoot.val && !res) {
res = isSame(node, subRoot)
if (res) {
return
}
}
traverse(node.left)
traverse(node.right)
}
traverse(root)
return res
};