zoukankan      html  css  js  c++  java
  • 17、剑指offer--树的子结构

    题目描述
    输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
     
    解题思路:
    1、在1中找到与2根节点相同的结点R
    2、判断1中以R为根节点的子树是否包含2
    3、如果不包含,再在1的左子树、右子树分别找,直到全部找完
     1 #include <iostream>
     2 #include <malloc.h>
     3 using namespace std;
     4 struct TreeNode {
     5     int val;
     6     struct TreeNode *left;
     7     struct TreeNode *right;
     8     TreeNode(int x) :
     9             val(x), left(NULL), right(NULL) {
    10     }
    11 };
    12 class Solution {
    13 public:
    14     //1、在1中找到与2根节点相同的结点R
    15     //2、判断1中以R为根节点的子树是否包含2
    16     //3、如果不包含,再在1的左子树、右子树分别找,知道全部找完
    17     bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    18     {
    19         bool result = false;
    20         if(pRoot1 != NULL && pRoot2 != NULL)
    21         {
    22             if(pRoot1->val == pRoot2->val)
    23             {
    24                 result = Tree1HasTree2(pRoot1,pRoot2);
    25             }
    26             if(!result)
    27             {
    28                 result = HasSubtree(pRoot1->left,pRoot2);
    29             }
    30             if(!result)
    31             {
    32                 result = HasSubtree(pRoot1->right,pRoot2);
    33             }
    34         }
    35         return result;
    36     }
    37     bool Tree1HasTree2(TreeNode *pRoot1,TreeNode *pRoot2)
    38     {
    39         if(pRoot2 == NULL)
    40             return true;
    41         if(pRoot1 == NULL)
    42             return false;
    43         if(pRoot1->val != pRoot2->val)
    44             return false;
    45         //1的左右子树是否和2的左右子树匹配
    46         return Tree1HasTree2(pRoot1->left,pRoot2->left)&&Tree1HasTree2(pRoot1->right,pRoot2->right);
    47     }
    48 };
    49 //先序建立二叉树
    50 TreeNode *CreateBiTree(){
    51     int ch;
    52 
    53     TreeNode *T;
    54     cin>>ch;
    55     if(ch== 0)T=NULL;
    56     else{
    57         T = (TreeNode *)malloc(sizeof(TreeNode));
    58         T->val = ch;
    59         cout<<"输入左子节点"<<endl;
    60         T->left = CreateBiTree();
    61         cout<<"输入右子节点"<<endl;
    62         T->right = CreateBiTree();
    63     }
    64     return T;//返回根节点
    65 }
    66 //先序遍历二叉树
    67 void PreOrderTraverse(TreeNode *T){
    68     if(T)
    69     {
    70        cout<<T->val<<" ";
    71        PreOrderTraverse(T->left);
    72        PreOrderTraverse(T->right);
    73     }
    74 }
    75 int main()
    76 {
    77     TreeNode *T1;
    78     cout<<"输入根节点:"<<endl;
    79     T1 = CreateBiTree();//建立
    80     cout<<"树1的先序遍历为"<<endl;
    81     PreOrderTraverse(T1);//输出
    82     cout<<endl;
    83     cout<<"输入根节点:"<<endl;
    84     TreeNode *T2;
    85     T2 = CreateBiTree();//建立
    86     cout<<"树2的先序遍历为"<<endl;
    87     PreOrderTraverse(T2);//输出
    88     cout<<endl;
    89     Solution s;
    90     bool res;
    91     res = s.HasSubtree(T1,T2);
    92     if(res)
    93         cout<<"树2是树1的子树"<<endl;
    94     else
    95         cout<<"树2不是树1的子树"<<endl;
    96     return 0;
    97 }

  • 相关阅读:
    Leastsq 最小二乘法拟合一次函数简单入门例子
    Matplotlab 基础画图
    plot(x,y1,'g',x,y2,'b--o',x,y3,'c*') 方法中对数据类型的要求和线条类型和颜色的设置
    [Java] 获取255年前芝加哥格式化时间
    [SoapUI] 在Assertion和Groovy Script里获取RequestId
    [SoapUI] 在脚本里写code执行某个step
    [SoapUI] 获取TestStep的状态
    [SoapUI] 判断失败继续执行
    [Java] 获取两个日期间的所有日期
    [Excel] excel中如何快速统计出各个项出现的次数?
  • 原文地址:https://www.cnblogs.com/qqky/p/6868000.html
Copyright © 2011-2022 走看看