zoukankan      html  css  js  c++  java
  • 递归之二叉树的子树和子结构

    参考链接:https://blog.csdn.net/nepenthe_csdn/article/details/52348194

    这里说一下二叉树的子树和子结构的概念:

    子树的意思是包含了一个结点,就得包含这个结点下的所有节点,一棵大小为n的二叉树有n个子树,就是分别以每个结点为根的子树。子结构的意思是包含了一个结点,可以只取左子树或者右子树,或者都不取。

    基本的数据结构TreeNode:

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

    下面是判断B是否是A的子树的代码:

    bool IsSametree(TreeNode* pRoot1,TreeNode* pRoot2)
            {
            if(pRoot1==NULL&&pRoot2 == NULL)//同时达到叶子结点
                return true;
            else
                return false;
            if(pRoot1->val == pRoot2->val)
                return IsSametree(pRoot1->left,pRoot2->left)&&IsSametree(pRoot1->right,pRoot2->right);
            else
                return false;
        }
        bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
        {
            if(pRoot2 == NULL)
                return false;
            else if(pRoot1 == NULL)
                return false;
            if(pRoot1->val == pRoot2->val)
                return IsSametree(pRoot1,pRoot2);
            if(pRoot1->val > pRoot2->val)
                return HasSubtree(pRoot1->left,pRoot2);
            if(pRoot1->val < pRoot2->val)
               return HasSubtree(pRoot1->right,pRoot2);
        }

    下面是判断B是否是A的子结构的代码,相对于上面判断是否是子树的代码稍微有所不同:

    首先,递归返回的条件不一样,当B到达了叶子结点,但是A没有到叶子结点,也是正确的,这是和上题不一样的地方。但是如果A先到叶子结点,就肯定不对,返回false。再者,因为不是二叉排序树,所以结点的值没有限制,如果不同的结点有相同的值,这就要注意了!可能找到和B根结点一样的值,但是从该结点往下查看,发现结点没有对应,不要直接返回false!因为可能有别的结点有相同的值,从该结点往下和B一样!此时要设置一个标志位,当是子结构是返回true,当不是子结构时返回false,此时再去搜索A的下一个结点,继续判断。

    class Solution {
    public:
        bool IsSubtree(TreeNode* pRoot1,TreeNode* pRoot2)
            {
            if(pRoot2==NULL)    //B同时或先到达叶子结点
                return true;
            else if(pRoot1 == NULL)
                return false;   //B不是空,但A是空,说明A先到达叶子结点
            if(pRoot1->val == pRoot2->val)
                return IsSubtree(pRoot1->left,pRoot2->left)&&IsSubtree(pRoot1->right,pRoot2->right);
            else
                return false;
        }
        bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
        {
            if(pRoot2 == NULL)
                return false;
            else if(pRoot1 == NULL)
                return false;   // A先到达叶子结点
            bool flag = false;
            if(pRoot1->val == pRoot2->val)
                flag = IsSubtree(pRoot1,pRoot2);
            if(!flag)
                flag = HasSubtree(pRoot1->left,pRoot2)||HasSubtree(pRoot1->right,pRoot2);
            return flag;
        }
    };
  • 相关阅读:
    JavaScript 执行机制
    前端问题总结
    【2020 -02- 07】组件与模板
    【2020-02-07】组件与模板
    【2020-01-23】组件与模板 -- 模板语法
    关于java.lang.UnsatisfiedLinkError的处理
    两个Activity传递数据和对象
    Android Activity为什么要细化出onCreate、onStart、onResume、onPause、onStop、onDesdroy这么多方法让应用去重载?(转)
    通过Android Studio 导出Jar包
    关于AccessibilityService的用法(转)
  • 原文地址:https://www.cnblogs.com/zf-blog/p/9856927.html
Copyright © 2011-2022 走看看