算法-树的子结构详解编程语言

/*
	[树的子结构]
    
    [题目]
	输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

    [解析]
    假设 pRoot1 的结点数为 m, pRoot2 的结点数为 n
    方法1: 使用二叉树的遍历方法(如下给出的代码),时间复杂度 O(m*n)
    方法2: 将两棵树进行序列化,可以将树转化为字符串,就编程了字符串的匹配问题,
          判断字符串 str2 是否包含在字符串 str1 中,使用 KMP 算法,最优可以时间复杂度为 O(m+n)

*/

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct TreeNode{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x):val(x), left(NULL), right(NULL) {}
};

class Solution{
public:
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2){
        if(pRoot2 == NULL || pRoot1 == NULL)
            return false;
        
        if(isSubTree(pRoot1, pRoot2))
            return true;
        else
            return HasSubtree(pRoot1->left, pRoot2) || HasSubtree(pRoot1->right, pRoot2);
    }

    bool isSubTree(TreeNode* pRoot1, TreeNode* pRoot2){
        if(pRoot1 == NULL && pRoot2 == NULL)
            return true;
        // pRoot1 != NULL || pRoot2 != NULL
        if(pRoot1 == NULL)
            return false;
        if(pRoot2 == NULL)
            return true;

        if(pRoot1->val != pRoot2->val)
            return false;

        return isSubTree(pRoot1->left, pRoot2->left) && isSubTree(pRoot1->right, pRoot2->right);
    }
};

int main()
{
    return 0;
}

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/15312.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论