每天一道leetcode:剑指 Offer 26. 树的子结构(中等&递归&BFS广度优先遍历&树)

今日份题目:

输入两棵二叉树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

提示

0 <= 节点个数 <= 10000

题目思路

使用递归判断B是否为A从某个节点开始的子树。

递归结束的条件有三个:如果B为空,说明能在A中找到完整的B,返回true;如果A为空,B还不为空,说明遍历完A了,也没找到完整的B,返回false;如果A和B都不为空,说明在某个中间节点,这时如果值不同,说明这个子树不是B,返回false。

如果结束条件都不满足,就说明当前节点是B中的一个节点,就继续判断左右节点是否都一样,进而得出结果。

原本的函数:使用BFS广度优先遍历所有节点,如果当前节点与B的值一致,那么就调用isSubtree函数判断一下当前节点为根节点的树是否包含B树。最后遍历所有的判断结果,只要有一个true那就返回true,否则就返回false。

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution 
{
public:
    bool isSubtree (TreeNode* A, TreeNode* B)//递归判断B是否为A的子树
    {
        //递归结束条件
        if(B==NULL) return true;//B为空,说明B遍历完了都是A的子树,返回true
        if(A==NULL&&B!=NULL) return false;//A为空,说明A遍历完了也没有遍历过整个B树,所以B不是A的子树
        if(A->val!=B->val) return false;//二者数值不一样,说明二者在相同结构下出现不同的数,那B不是A的子树
        return isSubtree(A->left,B->left)&&isSubtree(A->right,B->right);
        //剩下的情况说明当前节点相同,判断左右节点是否也都相同
    }

    bool isSubStructure(TreeNode* A, TreeNode* B) 
    {
        if(A==NULL||B==NULL) return false;//约定空树不是任意一个树的子结构
        //BFS层次遍历所有的节点
        queue p;
        p.push(A);
        vector ans;
        while(!p.empty())
        {
            int n=p.size();
            for(int i=0;ival==B->val) ans.push_back(isSubtree(cur,B));
                if(cur->left) p.push(cur->left);
                if(cur->right) p.push(cur->right);
            } 
        }
        for(int i=0;i

提交结果

每天一道leetcode:剑指 Offer 26. 树的子结构(中等&递归&BFS广度优先遍历&树)_第1张图片

 欢迎大家在评论区讨论,如有不懂的代码部分,欢迎在评论区留言!

你可能感兴趣的:(剑指Offer,leetcode,算法,职场和发展,c++,数据结构,广度优先,图论)