当前位置: 首页 > news >正文

剑指offer-树的子结构

树的子结构

一、问题描述

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

二、算法实现

2.1、Java实现

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;
    }

}
*/
public class Solution {
    public boolean HasSubtree(TreeNode root1,TreeNode root2) {
        boolean result=false;
        //当Tree1和Tree2都存在的时候,才进行比较。否则直接返回false
        if(root1!=null && root2!=null){
            //根节点一样,那就以这个根节点为起点,去判断是否包含Tree2
            if(root1.val == root2.val){
                result=IsSub(root1,root2);
            }
            //如果不一样,那就去root1的左儿子上去找
            if(!result){
                result=HasSubtree(root1.left,root2);
            }
            //如果不一样,root1的左儿子上也没有,那就去root1的右儿子上去找
            if(!result){
                result=HasSubtree(root1.right,root2);
            }
        }
        return result;
    }
    public boolean IsSub(TreeNode root1,TreeNode root2){
        if(root2==null){
            //Tree2已经没有要比较的结点了,也就是Tree2是Tree1的子结构,返回true
            return true;
        }
        if(root1==null){ // 此时root2!=null,也就是Tree2还有要比较的结点,而Tree1却没有
            return false;
        }
        if(root1.val != root2.val){//值不相同也不符合。
            return false;
        }
        return IsSub(root1.left,root2.left)&&IsSub(root1.right,root2.right);//如果都相同,那么,继续比较他们的左右子树是不是也是符合这种关系。
    }
}

这里面有两个递归,第一个递归HasSubtree是为了在root1中找到root2根节点相同的结点。
第二个递归是比较相同结点值下面的子节点是不是root2是root1的子结构。
第一个函数缩小了比较的范围,第二个才是正式比较是否为子结构。

2.2、C++实现

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
class Solution {
public:
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        bool result= false;
        if(pRoot1!=NULL&&pRoot2!=NULL){
            if(pRoot1->val == pRoot2->val){
                result = IsSub(pRoot1,pRoot2);
            }
            if(!result){
                result = HasSubtree(pRoot1->left,pRoot2);
            }
            if(!result){
                result = HasSubtree(pRoot1->right,pRoot2);
            }
        }
        return result;
    }
    
    bool IsSub(TreeNode* root1,TreeNode*  root2){
        if(!root2){
            return true;
        }
        if(!root1){
            return false;
        }
        if(root1->val != root2->val){
            return false;
        }
        return IsSub(root1->left,root2->left)&&IsSub(root1->right,root2->right);
    }
};

转载于:https://www.cnblogs.com/MarkKobs-blog/p/10413952.html

相关文章:

  • JavaScript HTML DOM
  • js提交表单错误:document.form.submit() is not a function
  • React as a UI Runtime(五、列表)
  • 如何进阶一名有竞争力的程序员?
  • 实现简单的正则表达式引擎
  • 读写配置文件模块configparser—参考杨永明博客
  • Android的WIFI局域网对讲机
  • todo: 改变字体的动画
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • 翻译:Hystrix - How To Use
  • k8s应用机密信息与配置管理(九)--技术流ken
  • 如何使用 JavaScript 解析 URL
  • patchwork.ffmpeg.org 里面未被选中的优秀代码
  • c# 设计模式
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • [iOS]Core Data浅析一 -- 启用Core Data
  • CentOS 7 防火墙操作
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • Hexo+码云+git快速搭建免费的静态Blog
  • Java精华积累:初学者都应该搞懂的问题
  • MySQL数据库运维之数据恢复
  • Redux 中间件分析
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 前端路由实现-history
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 前端知识点整理(待续)
  • MPAndroidChart 教程:Y轴 YAxis
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​插件化DPI在商用WIFI中的价值
  • $(function(){})与(function($){....})(jQuery)的区别
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (5)STL算法之复制
  • (java)关于Thread的挂起和恢复
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (补)B+树一些思想
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (十三)Maven插件解析运行机制
  • (转)visual stdio 书签功能介绍
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • @Async注解的坑,小心
  • @RequestParam详解
  • @RunWith注解作用
  • [17]JAVAEE-HTTP协议
  • [AIR] NativeExtension在IOS下的开发实例 --- IOS项目的创建 (一)
  • [autojs]autojs开关按钮的简单使用
  • [BUUCTF 2018]Online Tool
  • [bzoj1901]: Zju2112 Dynamic Rankings
  • [C++]unordered系列关联式容器
  • [C语言][PTA基础C基础题目集] strtok 函数的理解与应用