数据结构初阶之二叉树性质练习与代码练习

个人主页:点我进入主页

专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶

C语言刷题       数据结构初阶    Linux

欢迎大家点赞,评论,收藏。

一起努力,共赴大厂。

目录

1.前言

2.性质练习

3.代码练习 

3.1单值二叉树

3.2检查两颗树是否相同

3.3对称二叉树

3.4另一颗树的子树

4.总结


1.前言

        二叉树的学习是枯燥的也是充满乐趣的,它的核心部分是递归,这就需要我们多去刷题,树是一对多的结构,你是否还记得我在上一篇中写到树的内容可以分为根节点,左孩子右孩子,左子树右子树和根节点,左子树右子树这两种方法吗?这两种非常的重要,今天我们的代码部分会让你深刻的了解这句话,没有看上一篇对二叉树的解析的小伙伴可以去我主页进行查找。

2.性质练习

1. 某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为( )
A 不存在这样的二叉树
B 200
C 198
D 199

        我们根据二叉树的性质,只要是二叉树就会有度为0的节点个数等于度为2的节点个数加1,所以我们可以得到叶子节点的个数为200个,选择b。

 2.下列数据结构中,不适合采用顺序存储结构的是( )
A 非完全二叉树
B 堆
C 队列
D 栈

        虽然这几种都可以采用顺序表进行存储,但是非完全二叉树存储起来比较困难,主要是我们不容易找到父节点和孩子节点的位置,所以选择A。 

3.在具有 2n 个结点的完全二叉树中,叶子结点个数为( )
A n
B n+1
C n-1
D n/2

        我们知道二叉树有度为0,度为1,度为2,这三种所以我们可以得到n0+n1+n2=2n,我们在根据性质度为0的节点个数等于度为2的节点个数加1得到2n0+n1-1=2n.由于是完全二叉树,所以我们可以知道度为1的节点只能是0或1我们带入后可以知道有一个,所以叶子节点个数为n,所以选择A。

4.一棵完全二叉树的节点数位为531个,那么这棵树的高度为( )
A 11
B 10
C 8
D 12

        我们根据二叉树的深度为log(n+1),我们可以得到为10,所以选择B。

5.一个具有767个节点的完全二叉树,其叶子节点个数为()
A 383
B 384
C 385
D 386

        我们根据最后一个节点编号为766,它的父节点为(766-1)/2=382,所以叶子节点个数为766-382=384.所以我们选择B。

3.代码练习 

3.1单值二叉树

965. 单值二叉树

已解答

简单

相关标签

相关企业

如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。

只有给定的树是单值二叉树时,才返回 true;否则返回 false

示例 1:

输入:[1,1,1,1,1,null,1]
输出:true

示例 2:

输入:[2,2,2,5,2]
输出:false

        在这里我们分为根节点,左孩子右孩子,左子树右子树进行解题,当我们的根节点为空时返回true,当我们的左孩子不为空且值与根节点不同时返回false,当右孩子不为空且值与根节点不同时返回false,然后判断左子树与右子树,代码如下:

bool isUnivalTree(struct TreeNode* root) {
    if(root==NULL)
        return true;
    if(root->left&&root->left->val!=root->val)
        return false;
    if(root->right&&root->right->val!=root->val)
        return false;
    return isUnivalTree(root->left)&&isUnivalTree(root->right);
}

3.2检查两颗树是否相同

100. 相同的树

已解答

简单

相关标签

相关企业

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 1:

输入:p = [1,2,3], q = [1,2,3]
输出:true

示例 2:

输入:p = [1,2], q = [1,null,2]
输出:false

示例 3:

输入:p = [1,2,1], q = [1,1,2]
输出:false

        在这里我们分为根节点,左子树右子树,当我们的根节点都为空时返回true,当其中一个为空,另一个不为空时返回false,当都不为空时值不相同返回false,然后在判断左子树和右子树,详细代码如下:

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    if(p==NULL&&q==NULL)
        return true;
    if(p==NULL&&q!=NULL)
        return false;
    if(p!=NULL&&q==NULL)
        return false;
    if(p->val!=q->val)
        return false;
    return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
}

3.3对称二叉树

101. 对称二叉树

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:

输入:root = [1,2,2,null,3,null,3]
输出:false

        我们根据根节点,左孩子右孩子,左子树右子树进行判断,我们先判断根节点是否为空,为空返回false,然后判断左孩子和右孩子是否相同,然后返回左子树和右子树,这时候我们就将问题转化为判断左子树和右子树是否是同一颗树,我们就将问题转化为根节点,左子树右子树的问题,先判断权为空返回true,一个为空另一个不为空返回false,都不是空但是值不相同反水false,然后反水左子树与右子树。详细代码如下:

bool mysymmentric(struct TreeNode* p,struct TreeNode* q)
{
    if(p==NULL&&q==NULL)
        return true;
    if(p&&q&&q->val!=p->val)
        return false;
    if(p==NULL&&q!=NULL)
        return false;
    if(p!=NULL&&q==NULL)
        return false;
    return mysymmentric(p->right,q->left)&&mysymmentric(p->left,q->right);
    
}
bool isSymmetric(struct TreeNode* root) {
    if(root==NULL)
        return true;
    if(root->left==NULL&&root->right!=NULL)
        return false;
    if(root->right==NULL&&root->left!=NULL)
        return false;
    return mysymmentric(root->left,root->right);
}

3.4另一颗树的子树

572. 另一棵树的子树

已解答

简单

相关标签

相关企业

提示

给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。

二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。

示例 1:

输入:root = [3,4,5,1,2], subRoot = [4,1,2]
输出:true

示例 2:

输入:root = [3,4,5,1,2,null,null,null,null,0], subRoot = [4,1,2]
输出:false

       我们同样将问题转化为根节点,左子树右子树,当根结点为空时返回false,当根节点的值与它相同时进行判断是不是为相同的树,这是时候我们还是根节点,左子树右子树进行判断,当都为空时返回true,只有一个为空时返回fasle,值不相同时返回false,然后进行判断左子树右子树。然后判断左子树与右子树。详细代码如下:

bool issampetree(struct TreeNode* root1,struct TreeNode* root2)
{
    if(root1==NULL&&root2==NULL)
        return true;
    if(root1==NULL&&root2!=NULL)
        return false;
    if(root2==NULL&&root1!=NULL)
        return false;
    if(root1->val!=root2->val)
        return false;
    return issampetree(root1->right,root2->right)&&issampetree(root1->left,root2->left);

}

bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
    if(root==NULL)
        return false;
    if(root->val==subRoot->val)
    {
        if(issampetree(root,subRoot))
            return true;
    }
    return isSubtree(root->right,subRoot)||isSubtree(root->left,subRoot);
}

4.总结

        今天的内容就到这里了,想要学好二叉树就需要多练,可以多看看这篇文章和上一篇二叉树的文章,相信大家可以学到很多,其实二叉树就是递归,多画几次递归展开图就能理解其中是如何运行的。最后别忘了三连呀。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/222244.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实验报告-实验四(时序系统实验)

软件模拟电路图 说明 SW:开关,共六个Q1~Q3:输出Y0~Y3:输出 74LS194 首先,要给S1和S0高电位,将A~D的数据存入寄存器中(如果开始没有存入数据,那么就是0000在里面移位,不…

mvc模式test

项目结构 Book.java package beans; public class Book {private Integer id;private String name;private double price;public Integer getId() {return id;}public void setId(Integer id) {this.id id;}public String getName() {return name;}public void setName(Strin…

跨端的三种方案原理和对比(WebView,ReactNative,Flutter)

一、定义 WebView WebView是什么? 答: 第一代跨平台框架,代表者为:PhoneGap、微信小程序。 WebView标签是一种用于在网页中嵌入浏览器窗口的HTML元素。它的底层原理是通过原生平台提供的浏览器引擎来实现网页的渲染和交互。 …

虚拟人如何在线下活动实现实时交互?动捕设备或为最优解

随着时代的进步,虚拟人凭借其打破时空界限、新颖差异化视觉效果等特点,在发布会、峰会等线下活动中发挥着重要作用,想要实现虚拟人在线下活动中实时交互,使用动捕设备可以让虚拟人化身虚拟主持人、虚拟主播、虚拟舞者演员等。 虚拟…

Octave安装与教程

Octave是一种编程语言,旨在解决线性和非线性的数值计算问题。Octave为GNU项目下的开源软件,早期版本为命令行交互方式,4.0.0版本发布基于QT编写的GUI交互界面。Octave语法与Matlab语法非常接近,可以很容易的将matlab程序移植到Oct…

mysql pxc高可用离线部署(三)

pxc学习流程 mysql pxc高可用 单主机 多主机部署(一) mysql pxc 高可用多主机离线部署(二) mysql pxc高可用离线部署(三) mysql pxc高可用 跨主机部署pxc 本文使用docker进行安装,主机间通过…

leetcode:LCR 122. 路径加密(python3解法)

难度:简单 假定一段路径记作字符串 path,其中以 "." 作为分隔符。现需将路径加密,加密方法为将 path 中的分隔符替换为空格 " ",请返回加密后的字符串。 示例 1: 输入:path "a.a…

Cmake时遇到Could Not find CURL问题

操作系统:Ubuntu 20.04 cmake编译的时候,出现下述错误Could Not find CURL。 结合上述错误,又去看了CMakelist文件,看到CURL的最小版本需要7.28.0。 首先确认一下自己的curl是否安装,版本号是多少,结果如下…

【Spring Boot 】Spring Boot 常用配置总结

文章目录 前言1.多环境配置application.propertiesapplication.yaml 2.常用配置3.配置读取4.自定义配置 前言 在涉及项目开发时,通常我们会灵活地把一些配置项集中在一起,如果你的项目不是很大的情况下,那么通过配置文件集中不失为一个很好的…

Linux(ubuntu)利用ffmpeg+qt设计rtsp_rtmp流媒体播放器(完全从0开始搭建环境进行开发)

一、前言 从0开始搭建Linux下Qt、ffmpeg开发环境。 从安装虚拟机开始、安装Linux(Ubuntu)系统、安装Qt开发环境、编译ffmpeg源码、配置ffmpeg环境、编写ffmpeg项目代码、完成项目开发。 完全从0开始搭建环境进行开发 完全从0开始搭建环境进行开发 完全从0开始搭建环境进行开…

ROS 静态坐标转换

在 ROS 中,坐标变换(TF:Transform)它允许机器人系统中的各个部分使用不同的坐标系,并通过转换关系进行通信和协作。 静态坐标变换是指两个坐标系之间的相对位置关系是固定的,不会随时间改变。 例如&#…

Elasticsearch 入门(postman学习)-01

HTTP-索引-创建 对比关系型数据库,创建索引就等同于创建数据库。 在 Postman 中,向 ES 服务器发 PUT 请求 : http://127.0.0.1:9200/shopping 请求后,服务器返回响应: {"acknowledged": true,//响应结果&…

信息化,数字化,智能化是3种不同概念吗?与机械化,自动化矛盾吗?

先说结论: 1、信息化、数字化、智能化确实是3种不同的概念! 2、这3种概念与机械化、自动化并不矛盾,它们是制造业中不同发展阶段和不同层次的概念。 机械化:是指在生产过程中使用机械技术来辅助人工完成一些重复性、单一性、劳…

条件概率公式、全概率公式、贝叶斯公式

条件概率公式 设A、B为两个事件,为事件A发生的概率,为事件A和B同时发生的概率,并且,那么 称为A事件发生的条件下事件B发生的条件概率。 全概率公式 其中,A为一个事件,为样本空间的一个划分。 公式表达的…

binder线程安全即读取线程池部分剖析

背景 hi,粉丝朋友们: 大家好!近期有学员在学习binder过程中向我提出了2个疑问: 1、binder是否线程安全的,即同一个binder的服务端方法是不是同一个时间点,只有一个执行者? 2、binder的读取线程是怎么启动的…

RetsCloud AppLink适用的场景有哪些?

Applink是什么产品? AppLink是一款由RestCloud公司推出的超级应用连接器。无需开发,零代码,即可快速打通应用系统之间的数据。通过流程搭建,可以智能、高效地完成自动化任务,在大大提高工作效率的同时,也降…

状态设计模式

package com.jmj.pattern.state.after;public abstract class LiftState {protected Context context;public void setContext(Context context) {this.context context;}//电梯开启操作public abstract void open();//电梯关闭操作public abstract void close();//电梯运行操…

SystemWeaver—电子电气系统协同研发平台

背景概述 当前电子电气系统在汽车领域应用广泛,其设计整合了多门工程学科,也因系统的复杂性、关联性日益提升,需要其提供面向软件、硬件、网络、电气等多领域交织而导致的复杂系统解决方案。并且随着功能安全、AUTOSAR、SOA、以太网通讯等新要…

python中各式各样的字典操作

更多资料获取 📚 个人网站:ipengtao.com 在Python中,字典(Dictionary)是一种强大而灵活的数据结构,它允许你存储和检索键值对。本文将深入探讨Python中各式各样的字典操作,包括基本操作、高级操…

解析与预防:Java中的内存泄漏问题

目录 引言 1. 内存泄漏的定义 2. 内存泄漏的常见原因 2.1 引用保留 2.2 长生命周期的对象持有短生命周期对象的引用 3. 检测内存泄漏的手段 3.1 内存分析工具 3.2 日志和监控 4. 预防内存泄漏的方法 4.1 及时释放资源 4.2 使用弱引用 4.3 避免静态引用 5. 结语 引…