剑指 Offer 26. 树的子结构
1. 题目
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
例如:
给定的树 A:
3
/ \
4 5
/ \
1 2
给定树B:
4
/
1
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。
2. 示例
示例1
输入:A = [1,2,3], B = [3,1]
输出:false
示例2
输入:A = [3,4,5,1,2], B = [4,1]
输出:true
3. 题解
开始尝试了很多种方式,发现最初递归的方式始终不能回传。
最终的递归方式:
- 主要思想:将所有节点作为根节点,然后将B与A对比,B与A的左节点对比,B与A的右节点对比。
- 当找到相等的,那么就只需要对比B的左与A的左,B的右与A的右。
4. 实现
public class IsSubStructure26 {
public boolean isSubStructure(TreeNode A, TreeNode B) {
// 其中一个为null,直接返回false
if(A == null || B == null) return false;
// 将A的所有节点作为根节点
return middleScanner(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B);
}
private boolean middleScanner (TreeNode root, TreeNode cur) {
// B为null,说明所有的B在A中都能找到,返回true,结束。
if(cur == null) return true;
// 当A为null,B不为null,说明cur未能匹配完,返回false。
if(root == null) return false;
// A、B相等,继续比较它们的左右子节点。
if(root.val == cur.val) {
return middleScanner(root.left, cur.left) && middleScanner(root.right, cur.right);
} else {
// 不等,结束当前循环
return false;
}
}
}
5. 结语
努力去爱周围的每一个人,付出,不一定有收获,但是不付出就一定没有收获! 给街头卖艺的人零钱,不和深夜还在摆摊的小贩讨价还价。愿我的博客对你有所帮助(*^▽^*)(*^▽^*)!
如果客官喜欢小生的园子,记得关注小生哟,小生会持续更新(#^.^#)(#^.^#)。
但行好事 莫问前程