16、树的子结构

题目描述:

  输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
在这里插入图片描述

解题思路:

  对A和B分别使用先序遍历和中序遍历,若两种遍历方式,A的序列都包含【包含不一定非要是连续子串】B,则B是A的子结构。

Demo:

class Solution {
public:
    string str1;
    string str11;
    string str2;
    string str21;
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        if (pRoot2 == nullptr)
            return false;
        preorder(pRoot1, str1);
        preorder(pRoot2, str2);
        inorder(pRoot1, str11);
        inorder(pRoot2, str21);
        // 同时满足先序遍历包含和中序遍历包含则符合要求
        if (isequal(str1, str2) && isequal(str11, str21))
            return true;
        else
            return false;
    }
    // 判断一个字符串是否包含另一个子串(不一定是连续)
    bool isequal(string str1, string str2)
    {
        int i = 0, j = 0;
        int sz1 = str1.size();
        int sz2 = str2.size();
        while (i < sz1 && j < sz2){
            if (str2[j] == str1[i])
                j++;
            i++;
        }
        if (j == sz2)
            return true;
        else
            return false;
    }
    // 先序遍历
    void preorder(TreeNode *ptr, string &str)
    {
        if (ptr != nullptr){
            str.append(to_string(ptr->val));
            preorder(ptr->left, str);
            preorder(ptr->right, str);
        }
    }
    // 中序遍历
    void inorder(TreeNode *ptr, string &str)
    {
        if (ptr != nullptr){
            inorder(ptr->left, str);
            str.append(to_string(ptr->val));
            inorder(ptr->right, str);
        }
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~青萍之末~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值