剑指 Offer 26. 树的子结构

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

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

例如:
给定的树 A:

     3
    / \
   4   5
  / \
 1   2
给定的树 B:

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

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

解答代码

首先我们对A树进行一次左序遍历(方式应该不重要),

在遍历的过程中,对每个节点进行一次check遍历,检查以该A节点为root的树是否包含子树B。

  check主要检查,A 、B对应位置节点是否具有题目要求条件的val和分叉;

  check逻辑同理正常左序遍历,若每部check都相同,则在回溯时返回true。

 

复制代码
/**
 * 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 check(TreeNode* A, TreeNode* B)
    {
        //完全一致是错的,正确的是B有的,A得有,B没有的,A可有可无
        //if(B->val!=A->val  || ((B->left==NULL)!=(A->left==NULL))||((B->right==NULL)!=(A->right==NULL)))return false;
        if(B->val!=A->val)return false;
        if(B->left!=NULL)
        {
            if(A->left==NULL) return false;
        }
        if(B->right!=NULL)
        {
            if(A->right==NULL) return false;
        }


        bool dl=true,dr=true;
        if(B->left!=NULL)
            dl=check(A->left,B->left);
        if(B->right!=NULL)
            dr=check(A->right,B->right);

        return (dl)&&(dr);
    }

    bool isSubStructure(TreeNode* A, TreeNode* B) {
        if(B==NULL||A==NULL)return false;

        TreeNode *pa=A,*pb=B;

        queue<TreeNode * > qt;
        qt.push(pa);
        while(!qt.empty())
        {
            TreeNode *p=qt.front();
            qt.pop();
            if(p->left!=NULL)
                qt.push(p->left);
            if(p->right!=NULL)
                qt.push(p->right);

            if(check(p,B))
                return true;
        }
        return false;
    }
};
复制代码

 

posted @   简直可啪  阅读(15)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示