• 剑指offer-树的子结构


    题目描述

     

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

     

    解题思路

    考虑构造HasSubTree函数前序遍历树A递归判断子结构。从树A的根节点开始每遍历到一个节点,判断其结点值是否与树B的根节点值相等,若相等则调用IsSub函数判断A的此子树是否包含树B。具体来说,IsSub函数从树B的根节点开始与子树根节点比较,若不等则直接返回false,否则递归比较树B的左子树和右子树直到叶子节点,如果遍历完树B发现结点值都相等,则返回true。回到HasSubTree函数中,若此子树包含树B,那么直接返回true,否则继续递归判断左子树与右子树是否包含树B。若遍历完树A仍未发现树B,就返回false。

    代码

     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         if(pRoot1==NULL||pRoot2==NULL)
    15             return false;
    16         if(pRoot1->val==pRoot2->val)
    17             if(IsSub(pRoot1,pRoot2))
    18                 return true;
    19         else{
    20             if(pRoot1->left)
    21                 if(HasSubtree(pRoot1->left,pRoot2))
    22                     return true;
    23             if(pRoot1->right)
    24                 if(HasSubtree(pRoot1->right,pRoot2))
    25                     return true;
    26         }
    27         return false;
    28     }
    29     bool IsSub(TreeNode* pRoot1, TreeNode* pRoot2){
    30         if(pRoot1->val!=pRoot2->val)
    31             return false;
    32         if(pRoot2->left){
    33             if(pRoot1->left){
    34                 if(!IsSub(pRoot1->left,pRoot2->left))
    35                     return false;
    36             }
    37             else 
    38                 return false;
    39         }
    40         if(pRoot2->right){
    41             if(pRoot1->right){
    42                 if(!IsSub(pRoot1->right,pRoot2->right))
    43                     return false;
    44             }
    45             else
    46                 return false;
    47         }
    48         return true;
    49     }
    50 };
  • 相关阅读:
    【BZOJ1006】神奇的国度(弦图)
    弦图
    【BZOJ2946】公共串(后缀数组)
    【POJ1743】Musical Theme(后缀数组)
    JAVA和Tomcat运维整理
    linux shell 之if-------用if做判断
    Linux curl命令详解
    Intel HEX文件解析
    Linux bridge-utils tunctl 使用
    怎样查询锁表的SQL
  • 原文地址:https://www.cnblogs.com/wmx24/p/8881342.html
Copyright © 2020-2023  润新知