【二叉树练习题】

news2024/12/27 15:47:02

在这里插入图片描述

欢迎来到我的:世界

希望作者的文章对你有所帮助,有不足的地方还请指正,大家一起学习交流 !


目录

  • 前言
  • 初阶题
    • 二叉树的节点个数
    • 二叉树的叶子节点个数
    • 二叉树第k层节点个数
    • 二叉树查找值为x的节点
  • 进阶题
    • 完全二叉树的节点个数
    • 翻转二叉树
    • 检验两个树是否相同
    • 对称二叉树
    • 检验是否是其子树
  • 总结

前言

本篇文章共有9道题,其中4题是初阶,5题是进阶题;希望该文章对你有帮助!


初阶题

既然了解的二叉树的基本结构,接下来了解几个有关二叉树的基本函数吧!

二叉树的节点个数


如果知道一颗二叉树,那怎么求这颗二叉树的节点个数呢?

思路: 我们可以利用树的递归的思想,遍历这颗树,这里我们用前序遍历:如果遇到节点就再向左右子树深层递归下去+1(其本身),直到遇到空就返回0;
下面根据图解的方式:
在这里插入图片描述

代码实现:

//二叉树的节点个数
int BinaryTreeSize(BTNode* root)
{
    return root == NULL ? 0 : BinaryTreeSize(root->left) + BinaryTreeSize(root->right) + 1;
}

二叉树的叶子节点个数

知道二叉树的节点个数,那叶子结点个数呢?
叶子节点是和普通的节点不一样的,叶子结点其特点是:没有子节点的,所以我们可以根据这一特性来解决这个问题;

思路:我们还是可以利用二叉树树的结构特点,前序遍历这颗二叉树树,如果节点的左右节点返回=0,那就说明该节点是叶子结点,那就返回1,否则就返回左右子树的值;
在这里插入图片描述

代码实现:

//求叶子节点的个数
int BinaryTreeLeafSize(BTNode* root)
{
    if (root == NULL)
        return 0;
    
    int left = BinaryTreeLeafSize(root->left);
    int right = BinaryTreeLeafSize(root->right);

    return left + right == 0 ? 1 : (left + right);
}

注意:关于这代码实现,可能有老铁想过可以这样写代码是不是方便点:
代码:错误的示例

//求叶子节点的个数
int BinaryTreeLeafSize(BTNode* root)
{
    if (root == NULL)
        return 0;
  
    return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right) == 0  ? 1 : (BinaryTreeLeafSize(root->left) +  BinaryTreeLeafSize(root->right));
}

这样想的话就是理解的不够深刻,你要知道每次递归调用这个函数,调用的栈空间就越大,栈的空间不大,调用的越深越容易栈溢出;还有一点,你要知道的是这个节点的左右子树的返回值,如在前面的已经知道该节点的左右子树的返回值和,在往后走就会再一次往深层遍历一次了,这完全是没有必要,多此一举;

二叉树第k层节点个数

下面来加一点点难度吧!

思路:就是关键的k的值,在每次递归调用的时候 k-1,就可以实现了,不过还要加一条条件:如果当k==1时,就到了要求k层的节点个数的那层,这时只要不为空,则都返回 1,记住:这是求第k层的节点个数;
在这里插入图片描述

代码实现:

//二叉树第k层节点个数
int BinaryTreeLevelKSize(BTNode* root, int k)
{
    assert(k > 0);

    if (root == NULL)
        return 0;

    if (k == 1 )
        return 1;

    return BinaryTreeLevelKSize(root->left, k-1) + BinaryTreeLevelKSize(root->right, k-1);
}

二叉树查找值为x的节点

思路:二叉树最常利用的递归的思想,往下遍历一遍,找到了一样的值,就返回该值的结点,否则就返回NULL;
代码实现:

//二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
    if (root == NULL)
        return NULL;

    if (root->val == x)
        return root;

    BTNode* left = BinaryTreeFind(root->left, x);
    if (left)
        return left;
    BTNode* right = BinaryTreeFind(root->right, x);
    if (right)
        return right;
}

有一个改善版本:

//二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
    if (root == NULL)
        return NULL;

    if (root->val == x)
        return root;
    
    BTNode*left=BinaryTreeFind(root->left,x);
    if (left)
        return left;

    return BinaryTreeFind(root->right,x);
}

进阶题

完全二叉树的节点个数


地址:oj地址


在这里插入图片描述

解题思路:

这道题仔细一看是不是和我们上面初阶那道:求二叉树的节点个数一样,那这题是完全二叉树的结点个数,那不是肯定能行么?那我们先试一试能不能过;
答案是: 过了;在这里插入图片描述

代码实现:

//完全二叉树的节点个数
int countNodes(struct TreeNode* root){
return root == NULL ? 0 : countNodes(root->left) + countNodes(root->right) + 1;
}

翻转二叉树


地址:oj地址


在这里插入图片描述

解题思路:
可以看出,交换节点的左右子树即可;需要注意的是:返回的是节点本身,这要才能连带着其子节点交换过去;
在这里插入图片描述

//翻转二叉树
struct TreeNode* invertTree(struct TreeNode* root){
    if(root==NULL)
        return NULL;

    struct TreeNode*left=invertTree(root->left);
    struct TreeNode*right=invertTree(root->right);
    root->left=right;
    root->right=left;
    return root;
}

检验两个树是否相同


地址:oj地址


在这里插入图片描述

解题思路:
两颗树完全相同,代表着其所有子节点值都相同,那就同时遍历两颗树,是两颗树的左子树和左子树进行比较,右子树和右子树进行比较,绝不能左子树和右子树进行比较;遍历到底时,如果两树的节点都指向NULL则代表相同就返回true;如果只有其中一个节点指向NULL则代表两个节点不同返回flase,当两个节点指向的都不是NULL,那就比较节点值,不同的则返回flase;最后的判断条件,只要两颗树都返回true,则代表两颗树相同;

代码实现:

bool isSameTree(struct TreeNode* p, struct TreeNode* q){
    //两个都为空
    if(p==NULL && q==NULL)
        return true;
    //其中一个为空
    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);
}

对称二叉树


地址:oj地址


在这里插入图片描述

解题思路:
看一颗二叉树是否对称,完全可以以根节点当做是对称轴,然后比较根节点的左子树和右子树是否对称即可;简化为判断两棵树是否对称,这时候上面的一题:相同的树;很像,但不同的是对称,不是相同,所以我们需要变化一下,在相同的树的解题思路上,注意一点:他要比较的是一颗树的左子树和另一颗树的右子树进行比较,所以根据这点:

代码实现:

bool Cheak(struct TreeNode*q,struct TreeNode*p)
{
    //两个都为空
    if(p==NULL && q==NULL)
        return true;
    //其中一个为空
    if(p==NULL || q==NULL)
        return false;
    if(p->val!=q->val)
        return false;

    return Cheak(q->left,p->right) &&
        Cheak(q->right,p->left);
}

bool isSymmetric(struct TreeNode* root){
    struct TreeNode*left =root->left;
    struct TreeNode*right=root->right;

    return Cheak(left,right);
}

检验是否是其子树


地址:oj地址


在这里插入图片描述
在这里插入图片描述

解题思路:
这题我们可以换个思路:找到root树中与subRoot树相同的根节点后,就比较这两颗树是否相同,如果都相同,则代表subRoot树是root树的子树;只要找到相同的树,就不需要再找了;

代码实现:

bool isSameTree(struct TreeNode* p, struct TreeNode* q){
    //两个都为空
    if(p==NULL && q==NULL)
        return true;
    //其中一个为空
    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);
}

bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){

    if(root==NULL)
        return false;

    if(root->val==subRoot->val)
    {
        if(isSameTree(root,subRoot))
            return true;
    }
    return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
}

总结


到了最后:感谢支持

我还想告诉你的是:
------------对过程全力以赴,对结果淡然处之
也是对我自己讲的

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

修炼k8s+flink+hdfs+dlink(一:安装dlink)

一:mysql初始化。 mysql -uroot -p123456 create database dinky; grant all privileges on dinky.* to dinky% identified by dinky with grant option; flush privileges;二:上传dinky。 上传至目录/opt/app/dlink tar -zxvf dlink-release-0.7.4.t…

医学访问学者面试技巧

医学访问学者面试是一个非常重要的环节,它决定了你是否能够获得这个宝贵的机会去国外的大学或研究机构学习和研究。在这篇文章中,知识人网小编将分享一些关于医学访问学者面试的技巧,帮助你在面试中表现出色。 1. 准备充分 在参加医学访问学…

Multisim:JFET混频器设计(含完整程序)

目录 前言实验内容一、先看作业题目要求二、作业正文IntroductionPre-lab work3.13.2 Experiment Work4.1(2)circuit setup4.1(3)add 12V DC4.1(4)set input x1 and x24.1(5)4.1(6)4.1(7)4.2(1)(2)4.2(3)4.2(4)4.3(1)(2)4.3(3) Conclusion 三、资源包内容 前言 花了好大心血完成…

【线性代数及其应用 —— 第一章 线性代数中的线性方程组】-1.线性方程组

所有笔记请看: 博客学习目录_Howe_xixi的博客-CSDN博客https://blog.csdn.net/weixin_44362628/article/details/126020573?spm1001.2014.3001.5502思维导图如下: 内容笔记如下:

中国高清行政、地形、旅游、人文地图全集(地理干货,覆盖34个省市自治区)

中国高清行政、地形、旅游、人文地图全集(地理干货,覆盖34个省市自治区): 中国的高原、平原、盆地和丘陵 四大高原:青藏高原位于中国西南部,平均海拔在4000米以上,是中国最大、世界最高的大高原…

安卓手机如何下载谷歌应用商店(play.google.com)里的app,无需下载google play

不需要梯子! 不需要下载google play! 不需要考虑机型! 1、首先使用电脑打开网站 https://apps.evozi.com/ 点击 apk downloader 进入一个新的界面 2、电脑打开谷歌商店 https://play.google.com/store/apps 搜索任意软件,比如 …

300元开放式耳机推荐哪款好用一点、最便宜的开放式耳机

对于音乐爱好者来说,一款出色的耳机是必不可少的,开放式耳机以其独特的音场表现和舒适的佩戴感受,成为许多人钟爱的选择。如果你正在寻找一个300元价位好用的开放式耳机,今天就给大家推荐几款,希望能帮助到你~ 1、西圣…

python入门篇07-数据容器(序列 集合 字典,json初识)基础(下)

全文目录,一步到位 1.前言简介1.1 专栏传送门1.1.1 上文传送门 2. python基础使用2.1 序列2.1.1 序列定义2.1.2 序列参数解释2.1.3 列表list切片2.1.4 元组tuple切片2.1.5 字符串str切片 2.2 集合定义2.2.1 set集合-基本语法2.2.2 set集合-添加元素.add()2.2.3 set集合- 移除元…

bochs 对 Linux0.11 进行调试 (TODO: 后面可以考虑集成 vscode+gdb+qemu)

我在阅读 Linux0.11 源码时,对一个指令 LDS 感到困惑。 看了下 intel 指令集手册,能猜到 LDS 的功能,但不确定。 于是决定搭建调试环境,看看 LDS 的功能是否真如自己猜测。 首先 make debug 运行 qemu-Linux0.11,命…

死磕CMS垃圾回收器

为什么会有这篇文章? **校招垃圾回收面试重灾区。**本人秋招面试过大大小小的公司,发现几乎所有公司在面试的时候,一旦涉及到JVM只是,CMS和G1是常问点,而且CMS问的尤其多。所以本文会对根据网上常见的资料做一个整合并…

Qt扫盲-QTreeView 理论总结

QTreeView 理论使用总结 一、概述二、快捷键绑定三、提高性能四、简单实例1. 设计与概念2. TreeItem类定义3. TreeItem类的实现4. TreeModel类定义5. TreeModel类实现6. 在模型中设置数据 一、概述 QTreeView实现了 model 中item的树形表示。这个类用于提供标准的层次列表&…

Python3.x安装Pandas教程

python3.x 安装pandas总是会出现一些乱七八糟的问题,那现在就给你们讲述一种超级简单的安装方法,非常简单。 1,检查自己的python版本,我的是python3.4 32位的 2,https://www.lfd.uci.edu/~gohlke/pythonlibs/ 进入此网…

IIS部署Flask

启用 CGI 安装wfastcgi pip install wfastcgi 启用 wfastcgi 首先以管理员身份运行wfastcgi-enable来在IIS上启用wfastcgi,这个命令位于c:\python_dir\scripts,也就是你需要确保此目录在系统的PATH里,或者你需要cd到这个目录后再执行。 #…

np.clip()函数用法

代码: import numpy as npdelta np.clip(1.2, a_min0, a_max1)print(delta) 结果:

防御安全第五次作业

1. 什么是数据认证,有什么作用,有哪些实现的技术手段? 数据认证是指保证数据的真实性、完整性和可信度,以确保数据不被篡改或伪造。其作用包括但不限于: 保护关键数据不被恶意篡改或损坏 提供数据来源的可靠性和安全性…

ToBeWritten之记录狩猎过程

也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 转移发布平台通知:将不再在CSDN博客发布新文章,敬…

nodeJs 图片下载功能实现

const cheerio require("cheerio"); const axios require("axios"); const fs require("fs"); const request require("request"); const path require(path); // 图片存储位置 const fileImgUrl "./images/"; // 获取…

外部中断的基本操作

题目背景 定义一个 Working() 函数,使L1指示灯不断闪烁。将P32引脚定义成外部中断功能,按下S5按键就会产生外部中断触发信号,在中断响应函数中,点亮L8指示灯,延时较长一段时间后熄灭,该功能用两种方法实现…

ToBeWritten之评估数据质量

也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 转移发布平台通知:将不再在CSDN博客发布新文章,敬…

BLIP-2小结

paper:BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models 引用量:376(截止2023-09) motivation BLIPv2主要从模态对齐、高效训练两个方向对图文多模态预训练任务&…