zoukankan      html  css  js  c++  java
  • 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);
            
        }
    };
  • 相关阅读:
    XSS平台简单使用
    XSS基础笔记 from 《Web安全攻防 渗透测试实战指南》
    《Web安全攻防渗透测试实战指南》 各类型 SQL注入 实验过程整理
    BurpSuite抓取本地包方法
    渗透测试之信息收集(Web安全攻防渗透测试实战指南第1章)
    渗透测试方法论(qf总结)
    Linux Shell脚本简单语法汇总(Deepin下运行)
    写一个方法去掉字符串中的空格
    link 与 @import 区别
    uni-app 开发小工具——uni-toolkit
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/7932038.html
Copyright © 2011-2022 走看看