文章目录
- 题目详情
- 分析
- 判断A中有出现和B相同的结构和节点值
- 递归主体,解决问题
- 完整代码
- 总结
题目详情
树的子结构
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
分析
对于树的问题,我们要充分利用递归的思想,通过递归的思想,能够将复杂的问题简化解决,比如这道题。
判断A中有出现和B相同的结构和节点值
public static boolean recur(TreeNode A, TreeNode B) {
if (B == null) {
return true; // B已经为空了,是A的子结构,返回true
}
if (A == null || A.val != B.val) {
return false; // 返回为false的情况,A是空但B不是空或者A节点的值不等于B节点的值
}
// 满足前面两条,我需要再去检查左子树,右子树是否分别满足
return recur(A.left, B.left) && recur(A.right, B.right);
}
递归主体,解决问题
最关键的部分解决了,然后我们看怎么使用上面的结构去解决问题
public boolean isSubStructure(TreeNode A, TreeNode B) {
return (A != null && B != null) && (recur(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B));
}
这个递归主体就比较精炼了。
首先看
入口 (A != null && B != null) 返回true,不然就直接是错误了。
recur(A, B) 判断当前A中有出现和B相同的结构和节点值, 如果没有,我就去看isSubStructure(A.left, B) 左子树有没有,或者isSubStructure(A.right, B)右子树。注意里面是用"||",即recur(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B)
如此问题得到解决。
完整代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSubStructure(TreeNode A, TreeNode B) {
return (A != null && B != null) && (recur(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B));
}
public static boolean recur(TreeNode A, TreeNode B) {
if (B == null) {
return true; // 已经找到
}
if (A == null || A.val != B.val) {
return false;
}
return recur(A.left, B.left) && recur(A.right, B.right);
}
}
总结
对于树的问题,有限考虑能不能通过递归的方式进行解决,一般而言,通过递归能使问题简化,更容易解决。
注意:面试时,会经常问到关于树的问题,比如这道题在360面试的时候,就问到了。