题目描述
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
例如:
给定的树 A:
1 | 3 |
给定的树 B:
1 | 4 |
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。
示例一:
1 | 输入:A = [1,2,3], B = [3,1] |
示例二:
1 | 输入:A = [3,4,5,1,2], B = [4,1] |
题解
递归方法
看到这道题时经过分析可知需要两个递归过程:
过程一是判断当前节点为根节点的树与树B是否相同
|| 当前节点的左子树与树B是否相同
|| 当前节点的右子树与树B是否相同
, 写成isSubStructure(A, B)
方法:
特例:
当 树A
为空 或 树B
为空 时,直接返回false
返回值: 若树
B
是树A
的子结构,则必满足以下三种情况之一,因此用或||
连接- 以 节点
A
为根节点的子树 包含树B
,对应 recur(A, B); - 树
B
是 树A
左子树 的子结构,对应 isSubStructure(A.left, B); - 树
B
是 树A
右子树 的子结构,对应 isSubStructure(A.right, B);
- 以 节点
过程二是判断两个树是否相同, 要求是两节点的值相同, 左右子树也相同, 写成recur()
方法:
终止条件:
- 当节点
B
为空:说明树B
已匹配完成(越过叶子节点),因此返回true
; - 当节点
A
为空:说明已经越过树A
叶子节点,即匹配失败,返回false
; - 当节点
A
和B
的值不同:说明匹配失败,返回false
;
- 当节点
返回值:
- 判断
A
和B
的左子节点是否相等,即 recur(A.left, B.left) ; - 判断
A
和B
的右子节点是否相等,即 recur(A.right, B.right) ;
- 判断
1 | public class jz26 { |