1. 题目描述
输入两棵二叉树 A 和 B,判断 B 是不是 A 的子结构。
树的节点定义如下:
1 2 3 4 5 6 7 8 9 10
|
class Node { constructor(value, left = null, right = null) { this.value = value this.left = left this.right = right } }
|
2. 思路分析
假设判断的是p2
是不是p1
的子树,实现分为 2 个部分:
- 遍历树的函数
hasSubTree
:遍历 p1 的每个节点,如果当前节点的 value 和 p2 根节点的 value 相同,立即进入判断函数(下一个函数);否则继续遍历
- 判断子树的函数
doesTree1HaveTree2
:比较当前节点的值,再递归比较 p1 和 p2 的左右节点的值
3. 代码实现
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
function doesTree1HaveTree2(p1, p2) { if (!p2) { return true }
if (!p1 || p1.value !== p2.value) { return false }
return doesTree1HaveTree2(p1.left, p2.left) && doesTree1HaveTree2(p1.right, p2.right) }
function hasSubTree(p1, p2) { let result = false
if (p1 && p2) { if (p1.value === p2.value) { result = doesTree1HaveTree2(p1, p2) }
if (!result) { result = hasSubTree(p1.left, p2) } if (!result) { result = hasSubTree(p1.right, p2) } }
return result }
const tree1 = new Node(0, new Node(1, new Node(3)), new Node(2))
const tree2 = new Node(1, new Node(3))
console.log(hasSubTree(tree1, tree2))
|