• 16 树的子结构(这题多复习)


    题目描述

    输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
     
    这题分两步:
      第1:在树A中找到和树B的根节点的值一样的节点R,注意树的节点值可以有多个相同的值。
      第2:判断树A中以R为根节点的子树是不是包含和B一样的树结构。
    这题难在递归基和判断树节点为空该返回什么,一定要记清楚找头结点的时候遇到空节点就返回错,helper函数如果子树为空,还有就是result的使用。
    说明已经匹配完了,返回true;如果是树A为空,说明匹配不到子树,返回false。
     
    理解难点:helper每次返回以该根节点开始的是否匹配,然后判断左子树和右子树是否匹配。
     
    /*
    struct TreeNode {
        int val;
        struct TreeNode *left;
        struct TreeNode *right;
        TreeNode(int x) :
                val(x), left(NULL), right(NULL) {
        }
    };*/
    class Solution {
    public:
        bool helper(TreeNode* pRoot1, TreeNode* pRoot2){
            if(pRoot2 == nullptr){
                return true;
            }
            if(pRoot1 == nullptr){
                return false;
            }
            if(pRoot1 -> val != pRoot2 -> val){
                return false;
            }
            return helper(pRoot1 -> left,pRoot2 -> left) && helper(pRoot1 -> right,pRoot2 -> right);
        }
        
        bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2){
            if(pRoot1 == nullptr || pRoot2 == nullptr){
                return false;
            }
            bool result = false;
            if(pRoot1 -> val == pRoot2 -> val){
                result = helper(pRoot1,pRoot2);
            }
            if(!result){
                result = helper(pRoot1 -> left,pRoot2);
            }
            if(!result){
                result = helper(pRoot1 -> right,pRoot2);
            }
            return result;
        }
    };
    /*
    struct TreeNode {
        int val;
        struct TreeNode *left;
        struct TreeNode *right;
        TreeNode(int x) :
                val(x), left(NULL), right(NULL) {
        }
    };*/
    class Solution {
    public:
        bool helper(TreeNode* pRoot1, TreeNode* pRoot2){
            if(pRoot2 == nullptr){
                return true;
            }
            if(pRoot1 == nullptr){
                return false;
            }
            if(pRoot1 -> val != pRoot2 -> val){
                return false;
            }
            return helper(pRoot1 -> left,pRoot2 -> left) && helper(pRoot1 -> right,pRoot2 -> right);
        }
        bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2){
            if(pRoot1 == nullptr || pRoot2 == nullptr){
                return false;
            }
           
            if(pRoot1 -> val == pRoot2 -> val){
                if(helper(pRoot1,pRoot2)){
                    return true;
                }
            }
            return helper(pRoot1 -> left,pRoot2) ||  helper(pRoot1 -> right,pRoot2);
            
        }
    };
  • 相关阅读:
    PDF数据提取------2.相关类介绍
    Google搜索的常用技巧
    a helper class for generating xls or csv file
    正则 提取html标签value
    获取 windows地址栏 网页地址栏 文件名
    MSSQL将逗号分隔的字符串转换成列显示
    C# String.Format字符串中包含"{" "}"时需注意的问题
    格式化JSON中时间
    Oracle 10G创建表空间
    Sqlserver取最近一分组中最新一条记录
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/7932038.html
Copyright © 2020-2023  润新知