智商不够,递归真难啊

输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)

B是A的子结构, 即 A中有出现和B相同的结构和节点值。

例如:
给定的树 A:

     3
    / \
   4   5
  / \
 1   2

给定的树 B:

   4 
  /
 1

返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。

示例 1:

输入:A = [1,2,3], B = [3,1]
输出:false

示例 2:

输入:A = [3,4,5,1,2], B = [4,1]
输出:true
 1     public boolean isSubStructure(TreeNode A, TreeNode B) {
 2         // 递归思想 大问题分解为小问题
 3         // A, B为空 不符题意
 4         if(A == null || B == null) return false; 
 5         // dfs(A, B) 当前节点B是否是A的子树,若不是,则同理判断当前节点的孩子节点
 6         return dfs(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B);
 7     }
 8     public boolean dfs(TreeNode A, TreeNode B){
 9         // 比较孩子节点时, B可以为空, 例如[1]是[5,1]的子树 
10         if(B == null) return true;
11         // A为空, B不为空 B一定不是A子树
12         if(A == null) return false;
13         // 若两个节点的值不同 则B不可能是A的子树 相同则比较两个节点的孩子节点是否相同
14         return A.val == B.val && dfs(A.left, B.left) && dfs(A.right, B.right);
15     }
View Code

 

posted @ 2022-03-29 21:07  MessiaX  阅读(27)  评论(0编辑  收藏  举报