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


    1 题目描述

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

    2 思路和方法

    (1)先在A中找和B的根节点相同的结点

    (2)找到之后遍历对应位置的其他结点,直到B中结点遍历完,都相同时,则B是A的子树

    (3)对应位置的结点不相同时,退出继续在A中寻找和B的根节点相同的结点,重复步骤,直到有任何一棵二叉树为空退出

    3 C++核心代码

    3.1 递归实现1

     1 /*
     2 struct TreeNode {
     3     int val;
     4     struct TreeNode *left;
     5     struct TreeNode *right;
     6     TreeNode(int x) :
     7             val(x), left(NULL), right(NULL) {
     8     }
     9 };*/
    10 class Solution {
    11 public:
    12     bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    13     {
    14         //1.先找到和子树根节点相同的结点
    15         bool flag=false;
    16         if((pRoot1!=NULL)&&(pRoot2!=NULL))
    17         {
    18             if(pRoot1->val==pRoot2->val)
    19                 //开始判断,此时找到了和子树根节点相同的结点
    20                 flag=HasSubtreetty(pRoot1, pRoot2);
    21 
    22             if(!flag)
    23 
    24                 flag=HasSubtree(pRoot1->left, pRoot2);
    25 
    26             if(!flag)
    27 
    28                 flag=HasSubtree(pRoot1->right, pRoot2);
    29         }
    30         return flag;
    31     }
    32     
    33     bool HasSubtreetty(TreeNode* pRoot1, TreeNode* pRoot2)
    34     {
    35         //该函数需要判断在找到和子树根节点相同的结点之后,判断其余结点是否相同
    36         if(pRoot2==NULL)
    37             return true;
    38         if((pRoot1==NULL)&&(pRoot2!=NULL))
    39             return false;
    40         if(pRoot1->val!=pRoot2->val)
    41             return false;
    42         return HasSubtreetty(pRoot1->left, pRoot2->left)&&HasSubtreetty(pRoot1->right, pRoot2->right);
    43     }
    44 };
    View Code

    3.2 递归实现2

     1 /*
     2 struct TreeNode {
     3     int val;
     4     struct TreeNode *left;
     5     struct TreeNode *right;
     6     TreeNode(int x) :
     7             val(x), left(NULL), right(NULL) {
     8     }
     9 };*/
    10 class Solution {
    11 public:
    12     bool IsSubtree(TreeNode* p1, TreeNode* p2)
    13     {
    14         if(p2==NULL)return 1;
    15         if(p1==NULL)return 0;
    16 
    17         if(p1->val != p2->val)return 0;
    18 
    19         return IsSubtree(p1->left,p2->left) && IsSubtree(p1->right,p2->right);
    20     }
    21     bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    22     {
    23         if(pRoot1==NULL || pRoot2==NULL)return 0;
    24 
    25         return IsSubtree(pRoot1,pRoot2)||
    26             HasSubtree(pRoot1->left,pRoot2) ||
    27             HasSubtree(pRoot1->right,pRoot2);
    28     }
    29 };
    View Code

    4 完整代码

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 
     6 //struct ListNode {
     7 //    int val;
     8 //    struct ListNode *next;
     9 //    ListNode(int x) : val(x), next(NULL) {}
    10 //};
    11 
    12 struct TreeNode {
    13     int val;
    14     struct TreeNode *left;
    15     struct TreeNode *right;
    16     TreeNode(int x) :
    17         val(x), left(NULL), right(NULL) {
    18     }
    19 };
    20 
    21 class Solution {
    22 public:
    23     bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    24     {
    25         //1.先找到和子树根节点相同的结点
    26         bool flag = false;
    27         if ((pRoot1 != NULL) && (pRoot2 != NULL))
    28         {
    29             if (pRoot1->val == pRoot2->val)
    30                 //开始判断,此时找到了和子树根节点相同的结点
    31                 flag = HasSubtreetty(pRoot1, pRoot2);
    32 
    33             if (!flag)
    34 
    35                 flag = HasSubtree(pRoot1->left, pRoot2);
    36 
    37             if (!flag)
    38 
    39                 flag = HasSubtree(pRoot1->right, pRoot2);
    40         }
    41         return flag;
    42     }
    43 
    44     bool HasSubtreetty(TreeNode* pRoot1, TreeNode* pRoot2)
    45     {
    46         //该函数需要判断在找到和子树根节点相同的结点之后,判断其余结点是否相同
    47         if (pRoot2 == NULL)
    48             return true;
    49         if ((pRoot1 == NULL) && (pRoot2 != NULL))
    50             return false;
    51         if (pRoot1->val != pRoot2->val)
    52             return false;
    53         return HasSubtreetty(pRoot1->left, pRoot2->left) && HasSubtreetty(pRoot1->right, pRoot2->right);
    54     }
    55 };
    56 
    57 int main()
    58 {
    59     Solution *s = new Solution();
    60     TreeNode *t1 = new TreeNode(8);
    61     TreeNode *t2 = new TreeNode(9);
    62     TreeNode *t3 = new TreeNode(3);
    63     TreeNode *t4 = new TreeNode(8);
    64     TreeNode *t5 = new TreeNode(2);
    65     TreeNode *t6 = new TreeNode(4);
    66     TreeNode *t7 = new TreeNode(7);
    67     TreeNode *t8 = new TreeNode(6);
    68     TreeNode *t9 = new TreeNode(5);
    69     t1->left = t2; t1->right = t3; 
    70     t2->left = t4; t2->right = t5; t3->left = t6; t3->right = t7;
    71     t4->left = t8; t4->right = t9;
    72 
    73     TreeNode *tt1 = new TreeNode(8);    //只有8 6相同时也是子树,返回值为1
    74     //TreeNode *tt2 = new TreeNode(6);
    75     //TreeNode *tt3 = new TreeNode(5);
    76     TreeNode *tt2 = new TreeNode(1);
    77     TreeNode *tt3 = new TreeNode(4);
    78     tt1->left = tt2; tt1->right == tt3;
    79 
    80     bool out_tree = s->HasSubtree(t1, tt1);
    81     cout << out_tree << endl;
    82 
    83     system("pause");
    84     return 0;
    85 }
    View Code

    参考资料

    https://blog.csdn.net/weixin_36125166/article/details/75939373

    https://blog.csdn.net/danxibaoxxx/article/details/93402407

  • 相关阅读:
    解决Eclipse中文乱码
    C++中set用法回顾
    二分查找题目汇总
    给网卡配置多个IP地址(win/linux)
    route在windows与liunx下的使用区别
    eclipse 编程 c++ 快捷键
    Git、GitHub、GitLab三者之间的联系以及区别
    SQL语句优化
    《领域驱动设计的原则与实践》读书笔记(一)
    DotNet Core 介绍
  • 原文地址:https://www.cnblogs.com/wxwhnu/p/11410175.html
Copyright © 2020-2023  润新知