树的子结构

该博客探讨如何判断一棵树是否是另一棵树的子结构,提供了先序遍历的解法,并提到可能的优化方案——使用KMP算法,同时指出先序遍历不能唯一确定树的结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

   一、初步解法

    传说有很多简单解法,暂时通过的是这个。

    树的先序遍历,保存在数组中,匹配数组的子串,可优化的地方,可以使用KMP算法进行匹配子串优化,实现如下:

   

#include <queue>

struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(nullptr), right(nullptr) {
    }
};
class Solution {
public:
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        if (pRoot2 == nullptr || pRoot1 == nullptr)
        {
            return false;
        }

        std::vector<TreeNode *> vec_node1;
        MidForTree(pRoot1, vec_node1);

        std::vector<TreeNode *> vec_node2;
        MidForTree(pRoot2, vec_node2);
        bool is_ture = true;
        for (int i = 0; i < vec_node1.size() && vec_node1.size() - i > vec_node2.size(); i++) // 可采取KMP算法匹配子串
        {
            is_ture = true;
            for (int j = 0; j < vec_node2.size(); j++)
            {
                if (vec_node2[j]->val != vec_node1[i + j]->val)
                {
                    is_ture = false;
                    break;
                }
            }

            if (is_ture)
            {
                break;
            }
        }

        return is_ture;
    }

    void MidForTree(TreeNode *root, std::vector<TreeNode *> &vec_node)
    {
        if (root == nullptr)
        {
            return;
        }
        vec_node.push_back(root);
        MidForTree(root->left, vec_node);
 
        MidForTree(root->right, vec_node);
    }
};

二、其他方法

    待实现

     bug之处在于先序遍历不能确定唯一的树。不过反向的话不知道行不行,估计是测试用例没有异型树吧,侥幸通过

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值