zoukankan      html  css  js  c++  java
  • [剑指offer] 树的子结构

    题目描述

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

    建立一个函数isSubtreeWithSameRoot(TreeNode* pRoot1, TreeNode* pRoot2)判断第二个是不是第一个的子结构且是从根节点开始匹配相同的。

    然后在HasSubtree中前序遍历判断是否isSubtreeWithSameRoot。

    需要注意的是,子结构不需要是某个“叶结构”,只要是树的一个部分就是它的子结构。

    /*
    struct TreeNode {
        int val;
        struct TreeNode *left;
        struct TreeNode *right;
        TreeNode(int x) :
                val(x), left(NULL), right(NULL) {
        }
    };*/
    class Solution {
    public:
        bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
        {
            if (!pRoot1 || !pRoot2) return false;
            if (isSubtreeWithSameRoot(pRoot1, pRoot2)) return true;
            if (HasSubtree(pRoot1->left, pRoot2)) return true;
            if (HasSubtree(pRoot1->right, pRoot2)) return true;
            return false;
        }
        bool isSubtreeWithSameRoot(TreeNode* pRoot1, TreeNode* pRoot2)
        {
            if (!pRoot1 && pRoot2) return false;
            if (!pRoot2) return true;
            if (pRoot1->val != pRoot2->val) return false;
            return isSubtreeWithSameRoot(pRoot1->left, pRoot2->left)
                && isSubtreeWithSameRoot(pRoot1->right, pRoot2->right);
        }
    };
  • 相关阅读:
    POJ 2752 KMP中next数组的理解
    KMP详解
    HDU 3221 矩阵快速幂+欧拉函数+降幂公式降幂
    POJ 3220 位运算+搜索
    反素数深度分析
    POJ 2886 线段树单点更新
    求反素数的方法
    CV第八课 GPU/CPU
    49. 字母异位词分组
    48. 旋转图像
  • 原文地址:https://www.cnblogs.com/zmj97/p/7905181.html
Copyright © 2011-2022 走看看