一、题目描述
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
例如:
给定的树 A:
给定的树 B:
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。
二、思路分析
因为树 B 是树 A 的子结构,那么 B 的根节点可以是 A 中的任意一个节点,所以我们需要依次将 B 的根节点与 A 中的所有节点进行比较,如果相同,则开始比较 A 中的子结构与 B 是否完全相同,比较的方法也很简单,就是从根节点开始,依次比较 A 中子结构的左右节点与 B 中的左右节点是否相同。
步骤:
- 在 A 中找出与 B 根节点相同的节点
- 从此节点开始递归遍历下面节点是否与 B 相同。
结束条件:
- 如果 B 中已经为null,那么即使 A 中依然存在节点,也不需要继续遍历了,直接返回 true。
- 如果 A 中已经为null,那么 A 中就不存在 B 中存在的节点,直接返回 false。
- 如果 B 中节点与 A 中的节点不相同,直接返回 false。
三、AC 代码
public boolean isSubStructure(TreeNode A, TreeNode B) {
if(B == null || A == null) return false;
// 比较 A 中所有节点与 B 的根节点
return helper(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B);
}
public boolean helper(TreeNode A, TreeNode B){
if(B == null) return true;
if(A == null) return false;
if(A.val != B.val) return false;
// 依次判断 A 和 B 中左右节点是否相同
boolean left = helper(A.left, B.left);
boolean right = helper(A.right, B.right);
return left && right;
}
四、总结
本题主要考察的就是对树的遍历掌握得是否得当,难度不大,但是需要思路清晰。树的遍历无非就是使用递归,依次使用它的左节点和右节点作为遍历的参数即可。
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情