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

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

例如:
给定的树 A:

  1. 3
  2. / \
  3. 4 5
  4. / \
  5. 1 2

给定的树 B:

  1. 4
  2. /
  3. 1

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

示例 1:

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

示例 2:

  1. 输入:A = [3,4,5,1,2], B = [4,1]
  2. 输出:true

限制:

  • 0 <= 节点个数 <= 10000

算法思路:

isSubStructure(A, B) 函数

  • 如果A为空或者B为空,则返回false;

  • recur(A,B)如果B是A的子树,则返回true,否则看

    • isSubStructure(A.left, B)的A的左子树是B的子树
    • 或者isSubStructure(A.right, B)的A的右子树是B的子树

recur(A, B) 函数:

  • 当节点B为空,说明B已经被匹配过了,则返回true
  • 当A为空 说明越过了A的树的子节点 或者A的值不等于B的值,则返回false
  • 返回值看recur(A.left,B.left)判断A和B的左子节点是否相等,返回则为true
  • 看recur(A.left, B.left)判断A和B的右子节点是否相等,返回则为true
  1. class Solution {
  2. public boolean isSubStructure(TreeNode A, TreeNode B) {
  3. if (A == null || B == null)
  4. return false;
  5. return recur(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B);
  6. }
  7. boolean recur(TreeNode A, TreeNode B) {
  8. if (B == null)
  9. return true;
  10. if (A == null || A.val != B.val)
  11. return false;
  12. return recur(A.left,B.left) && recur(A.left, B.left);
  13. }
  14. }

k神的代码更为简洁,见代码如下:

  1. class Solution {
  2. public boolean isSubStructure(TreeNode A, TreeNode B) {
  3. return (A != null && B != null) && (recur(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B));
  4. }
  5. boolean recur(TreeNode A, TreeNode B) {
  6. if(B == null) return true;
  7. if(A == null || A.val != B.val) return false;
  8. return recur(A.left, B.left) && recur(A.right, B.right);
  9. }
  10. }

以及力友分享的注释版本:

  1. class Solution {
  2. //参考视频讲解:https://www.bilibili.com/video/BV1pK4y177jA?from=search&seid=7308257970624224318
  3. public boolean isSubStructure(TreeNode A, TreeNode B) {
  4. if(A==null || B==null) return false;//约定空树不是任意一个树的子结构
  5. if(helper(A,B)) return true;
  6. return isSubStructure(A.left,B) || isSubStructure(A.right,B);//递归判断A树所有子树是否包含B树
  7. }
  8. //该函数的作用是:判断A树根节点值和B树根节点值是否相等,若不等,返回false,若相等在递归判断A树的孩子节点和B树的的孩子节点是否对应相等,如果对应相等了,就说明A的子结构包含B树,返回true。否者就不包含,返回false
  9. public boolean helper(TreeNode A,TreeNode B){
  10. if(B==null) return true;
  11. if(A==null || A.val!=B.val) return false;//A树为空或者A节点的值不等于B结点的值,返回false
  12. return helper(A.left,B.left) && helper(A.right,B.right);//当A.val==B.val时,递归判断A树的子节点和B树的子节点是否对应相等
  13. }
  14. }

参考链接:

https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof/solution/mian-shi-ti-26-shu-de-zi-jie-gou-xian-xu-bian-li-p/

版权声明:本文为RainsX原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/RainsX/p/15219801.html