• 树的子结构(二叉树的创建,遍历,查询)(c++)


    题目描述

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

    【分析】

    典型的二叉树问题。 
    判断两个二叉树的所属关系,其实还是要从二叉树的结构特点出发,二叉树由根节点和左右孩子构成,如果一个二叉树是另一个的子树,说明这个二叉树根节点,左右孩子必然存在于另一个二叉树中,例如:

    这里写图片描述

    观察上图,发现第二个二叉树明显是第一个二叉树的子结构,首先,看根节点,8,第一棵树根节点为8,等于第二棵二叉树,观察其左右孩子结构,如果一致,说明所属关系成立,但是根结点为8的第一棵二叉树左孩子是8,第二棵二叉树左节点却是9,所以继续查看观察的第一棵二叉树的左子树,左子树第一个根节点就是8,所以看它的左右孩子,左孩子是9,等于第二棵二叉树,所以再看右孩子,是2,结构完全相等,说明第二棵二叉树是第一棵二叉树的子结构成立。

    在判断过程中,很明显用递归方法比较简单,递归判断二叉树A的根结点和二叉树B根节点是否相同,找到相同的后,再递归判断左右孩子结构是否一致。

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <vector>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    
    struct TreeNode
    {
        char val;
        struct TreeNode *left;
        struct TreeNode *right;
        TreeNode(int x):val(x),left(NULL),right(NULL) {}
    };
    
    //按前序遍历输入二叉树中结点的值,构建二叉树
    
     void creat(TreeNode **T)
        {
            char ch;
            scanf("%c",&ch);
            if(ch=='#')
                *T=NULL;
            else
            {
                *T=(struct TreeNode *)malloc(sizeof(struct TreeNode));
                (*T)->val=ch;
                creat(&(*T)->left);
                creat(&(*T)->right);
            }
        }
    
    //输出前序遍历
    void print(TreeNode* &root)
    {
        if(root==NULL)
            return;
        cout<<root->val;
        print(root->left);
        print(root->right);
    }
    
    //输出中序遍历
    void print1(TreeNode* &root)
    {
        if(root==NULL)
            return;
        print(root->left);
         cout<<root->val;
        print(root->right);
    }
    
    //输出后序遍历
    void print2(TreeNode* &root)
    {
        if(root==NULL)
            return;
        print(root->left);
        print(root->right);
        cout<<root->val;
    }
    
    class Solution
    {
    public:
        bool doesTree1HasTree2(TreeNode *pRoot1,TreeNode *pRoot2)
        {
            if(pRoot2==NULL)
                return true;
            if(pRoot1==NULL)
                return false;
            if(pRoot1->val!=pRoot2->val)
                return false;
            return doesTree1HasTree2(pRoot1->left,pRoot2->left)&&doesTree1HasTree2(pRoot1->right,pRoot2->right);
        }
    
        bool HasSubtree(TreeNode* pRoot1,TreeNode* pRoot2)
        {
            bool result=false;
            if(pRoot1!=NULL&&pRoot2!=NULL)
            {
                if(pRoot1->val==pRoot2->val)
                    result=doesTree1HasTree2(pRoot1,pRoot2);
                if(!result)
                    result=HasSubtree(pRoot1->left,pRoot2);
                if(!result)
                    result=HasSubtree(pRoot1->right,pRoot2);
            }
            return result;
        }
    
    };
    int main()
    {
        TreeNode *root1=NULL,*root2=NULL;
        creat(&root1);
        getchar();
        creat(&root2);
        //print(root1);
        //cout<<endl;
        //print(root2);
    
        Solution s;
       cout<<s.HasSubtree(root1,root2)<<endl;
        return 0;
    }

    输入:

    889##24##7##7##
    89##2##

    输出:

    1

  • 相关阅读:
    物联网相关期刊会议
    Java O O第十一天
    mac下安装伪分布hadoop2.6.0和hbase1.0.1.1
    Ubuntu下使用openssl为apache2配置ssl
    ubuntu下安装hadoop
    ubuntu 添加应用到Dash启动器
    Ubuntu12.04中安装Oracle JDK和NetBeans的方法
    Ubuntu12.04中在桌面建立指向网页的链接文件的方法
    Ubuntu12.04中Gvim无法固定到启动器的解决办法
    Ubuntu中apt-get安装或更新软件错误的解决办法
  • 原文地址:https://www.cnblogs.com/dshn/p/8875616.html
Copyright © 2020-2023  润新知