16、树的子结构

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/daaikuaichuan/article/details/84899019

题目描述:

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

猜你喜欢

转载自blog.csdn.net/daaikuaichuan/article/details/84899019