数据结构——二叉树提升

news2025/3/1 4:00:41

在这里插入图片描述

二叉树题型练习

  • 前言
  • 一、节点个数以及高度等
  • 二、二叉树OJ题
    • 二叉树的前序遍历
    • 二叉树的中序遍历
    • 二叉树的后序遍历
    • 单值二叉树
    • 二叉树最大深度
    • 检查两颗树是否相同
    • .翻转二叉树
    • 对称二叉树
    • 另一颗树的子树
  • 总结


前言

现在我们开始一轮新的自我提升吧!
二叉树的题目当然也更有难度!
没有什么是生来就会的,尤其是代码这一方面
更是讲究熟能生巧,现在的我们学习代码编程就像婴儿学习灵活使用双手一般

相信以后的我们也可以像使用双手一般毫无困难地编写程序!


一、节点个数以及高度等

// 二叉树节点个数
int BinaryTreeSize(BTNode* root);
// 二叉树叶子节点个数
int BinaryTreeLeafSize(BTNode* root);
// 二叉树第k层节点个数
int BinaryTreeLevelKSize(BTNode* root, int k);
// 二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x);

size保存的是代码执行到当前位置符合条件的节点个数
1.节点个数代码实现

int TreeSize(BTNode* root) {
	static int size = 0;
	if (root == NULL)
		return 0;
	else
		++size;
	TreeSize(root->left);
	TreeSize(root->right);
	return size;
}

思路解析:
在这里插入图片描述
在这里插入图片描述
2.叶子节点个数代码实现

int TreeLeafSize(BTNode* root) {
	if (root == NULL)
		return 0;
	if (root->left == NULL && root->right) {
		return 1;
	}
	return TreeLeafSize(root->left) + TreeLeafSize(root->right);
}

思路解析:
在这里插入图片描述
3.第k层节点个数代码实现

int TreeKLevel(BTNode* root,int k) {
	assert(k > 0);
	if (root == NULL)
		return 0;
	if (k == 1) {
		return 1;
	}
	return TreeKLevel(root->left,k-1) + TreeKLevel(root->right,k-1);
}

思路解析
在这里插入图片描述
4.查找值为x的结点

BTNode* TreeFind(BTNode* root, int x) {
	if (root == NULL)
		return NULL;
	if (root->val == x)
		return root;
	BTNode* ret = NULL;
	ret = TreeFind(root->left, x);
	if (ret)
		return ret;
	ret = TreeFind(root->right, x);
	if (ret)
		return ret;
	return NULL;
}

思路解析
在这里插入图片描述

二、二叉树OJ题

二叉树的前序遍历

题目链接:OJ链接
在这里插入图片描述在这里插入图片描述在这里插入图片描述

提示:

树中节点数目在范围 [0, 100] 内
-100 <= Node.val <= 100

思路解析
此题要保存节点,所以需要先获取节点个数,然后进行前序遍历,保存每一个节点值。
代码实现:

int TreeSize(struct TreeNode* root){
    return root!=NULL?1+TreeSize(root->left)+TreeSize(root->right):0;
}

void PreOrder(struct TreeNode* root,int*arr,int*i){
    if(root==NULL){
        return;
    }
    arr[(*i)++]=root->val;
    PreOrder(root->left,arr,i);
    PreOrder(root->right,arr,i);
}

int* preorderTraversal(struct TreeNode* root, int* returnSize){
    int n=TreeSize(root);
    int* arr=(int*)malloc(sizeof(int)*n);
    int m=0;
    PreOrder(root,arr,&m);
    *returnSize=n;
    return arr;
}

图例解析
在这里插入图片描述

二叉树的中序遍历

题目链接:OJ链接
在这里插入图片描述

提示:

树中节点数目在范围 [0, 100] 内
-100 <= Node.val <= 100

思路解析
解题思路同上题,遍历时进行中序遍历
代码实现:

int TreeSize(struct TreeNode* root){
    return root==NULL?0:1+TreeSize(root->left)+TreeSize(root->right);
}

void MidOrder(struct TreeNode* root,int*arr,int*i){
    if(root==NULL)
        return;
    MidOrder(root->left,arr,i);
    arr[(*i)++]=root->val;
    MidOrder(root->right,arr,i);
}

int* inorderTraversal(struct TreeNode* root, int* returnSize){
    int n=TreeSize(root);
    *returnSize=n;
    int*arr=(int*)malloc(sizeof(int)*n);
    int m=0;
    MidOrder(root,arr,&m);
    return arr;
}

图例解析
在这里插入图片描述

二叉树的后序遍历

题目链接:OJ链接
在这里插入图片描述

提示:

树中节点的数目在范围 [0, 100] 内
-100 <= Node.val <= 100

思路解析
解题思路同上题,遍历时进行后序遍历
代码实现:

int TreeSize(struct TreeNode* root){
    return root==NULL?0:1+TreeSize(root->left)+TreeSize(root->right);
}

void LastOrder(struct TreeNode* root,int*arr,int*i){
    if(root==NULL)
        return;
    LastOrder(root->left,arr,i);
    LastOrder(root->right,arr,i);
      arr[(*i)++]=root->val;
}

int* inorderTraversal(struct TreeNode* root, int* returnSize){
    int n=TreeSize(root);
    *returnSize=n;
    int*arr=(int*)malloc(sizeof(int)*n);
    int m=0;
    LastOrder(root,arr,&m);
    return arr;
}

图例解析
在这里插入图片描述

单值二叉树

题目链接:OJ链接
在这里插入图片描述在这里插入图片描述

提示:

给定树的节点数范围是 [1, 100]。
每个节点的值都是整数,范围为 [0, 99] 。

思路解析
遍历二叉树,并且每一个节点值都和根节点的值进行比对,如果不等于根节点的值,则不是单值树。

代码实现:

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);
}

图例解析
在这里插入图片描述

二叉树最大深度

题目链接:OJ链接
在这里插入图片描述在这里插入图片描述

提示:

树中节点的数量在 [0, 104] 区间内。
-100 <= Node.val <= 100

思路解析
二叉树的最大深度等价于:左右子树的最大深度 + 1

代码实现:

int maxDepth(struct TreeNode* root){
    if(root==NULL)
        return 0;
    int leftdeep = maxDepth(root->left);
    int rightdeep = maxDepth(root->right);
    return (leftdeep > rightdeep)?(leftdeep+1):(rightdeep+1);
}

图例解析:
在这里插入图片描述

检查两颗树是否相同

题目链接:OJ链接
在这里插入图片描述在这里插入图片描述

提示:

两棵树上的节点数目都在范围 [0, 100] 内
-104 <= Node.val <= 104

思路解析
首先比较根节点是否相同,然后分别比较左右子树是否相同
代码实现:

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链接
在这里插入图片描述在这里插入图片描述

提示:

树中节点数目范围在 [0, 100] 内
-100 <= Node.val <= 100

思路解析
用后序翻转每一棵树的左右子树根节点
代码实现:

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

图例解析
在这里插入图片描述

在这里插入图片描述

对称二叉树

题目链接:OJ链接
在这里插入图片描述在这里插入图片描述

提示:

树中节点数目在范围 [1, 1000] 内
-100 <= Node.val <= 100

思路解析
判断一个树是否对称,首先要判断左右孩子是否对称相等,还需要判断左孩子的左子树是否和右孩子的右子树对称,左孩子的右子树是否和右孩子的左子树对称。
将左右子树传入判断二叉树是否相同的函数
代码实现:

bool check(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 check(p->left, q->right) && check(p->right, q->left);
    else
        return false;
}

bool isSymmetric(struct TreeNode* root){
    return check(root, root);
}

图例解析
具体参考前面判断二叉树是否相同的例题

另一颗树的子树

题目链接:OJ链接
在这里插入图片描述在这里插入图片描述在这里插入图片描述

提示:

root 树上的节点数量范围是 [1, 2000]
subRoot 树上的节点数量范围是 [1, 1000]
-104 <= root.val <= 104
-104 <= subRoot.val <= 104

思路解析
判断t是否为s的子树,需要判断t是否和s的某一个子树相同,所以此题就是判断两棵树是否相同的逻辑。
前序遍历到与第二棵树根节点val相同的结点
再传入比较函数进行判断

代码实现:

bool check(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 check(p->left,q->left)&&check(p->right,q->right);
}

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

图例解析
具体参考前面判断二叉树是否相同的例题及前序遍历例题


总结

现在我们开始一轮新的自我提升吧!
二叉树的题目当然也更有难度!
但没关系,一起加油,这些都是小困难!芜湖~

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

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

相关文章

【每日一题】34. 在排序数组中查找元素的第一个和最后一个位置

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣&#xff08;LeetCode&#xff09; 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 […

【LeetCode每日一题合集】2023.9.11-2023.9.17(⭐反悔贪心拓扑排序Floyd)

文章目录 630. 课程表 III解法——反悔贪心⭐⭐⭐⭐⭐ 1462. 课程表 IV⭐解法1——拓扑排序预处理解法2——Floyd算法判断是否存在路径 2596. 检查骑士巡视方案&#xff08;方向模拟&#xff09;1222. 可以攻击国王的皇后&#xff08;方向模拟&#xff09;LCP 50. 宝石补给&…

Java学习之常见易错点总结--第一期

&#x1f495;"不要同情自己&#xff0c;那是卑劣懦夫干的勾当。"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;Java学习之常见易错点总结--第一期 1.什么时候变量不用初始化&#xff1f; 先来看如下代码&#xff1a; public static void main(…

MediaPipe+OpenCV 实现实时手势识别(附Python源码)

MediaPipe官网&#xff1a;https://developers.google.com/mediapipe MediaPipe仓库&#xff1a;https://github.com/google/mediapipe 一、MediaPipe介绍 MediaPipe 是一个由 Google 开发的开源跨平台机器学习框架&#xff0c;用于构建视觉和感知应用程序。它提供了一系列预训…

C#中Visual Studio如何为解决方案设置启动项目

目录 第一种方法:快速选定启动项目的方法1.在解决方案资源管理器中,选择解决方案(最高层节点)2.选择解决方案节点的上下文(右键单击)菜单,然后选择“属性”。 “解决方案属性页”对话框随即显示第二种方法:右击First11或者second11,点击设置启动项目即可Visual Studio…

C++ PrimerPlus 复习 第七章 函数——C++的编程模块(上)

第一章 命令编译链接文件 make文件 第二章 进入c 第三章 处理数据 第四章 复合类型 &#xff08;上&#xff09; 第四章 复合类型 &#xff08;下&#xff09; 第五章 循环和关系表达式 第六章 分支语句和逻辑运算符 第七章 函数——C的编程模块&#xff08;上&#xff…

【红包雨】中间件与环境安装

创建环境 创建专用网络VPC 安全组 创建云服务器 打包部署 2. Java环境 #下载jdk17 wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz #安装上传工具 以后使用命令 rz 选中文件进行上传 yum install -y lrzsz#解压 tar -xzvf jdk-17_linux-x64…

Hive参数与性能调优-V2.0

Hive作为大数据平台举足轻重的框架&#xff0c;以其稳定性和简单易用性也成为当前构建企业级数据仓库时使用最多的框架之一。 但是如果我们只局限于会使用Hive&#xff0c;而不考虑性能问题&#xff0c;就难搭建出一个完美的数仓&#xff0c;所以Hive性能调优是我们大数据从业…

VMware Fusion 13+Ubuntu ARM Server 22.04.3在M2芯片的Mac上共享文件夹

因为Server版没有桌面&#xff0c;VMware Tools不能直接装&#xff0c;导致没办法共享文件。 Ubuntu中的包如果需要更新&#xff0c;先执行下面的步骤 sudo apt update 再执行 sudo apt upgrade 不需要更新的话&#xff0c;直接执行下面的步骤 先把open-vm-tools卸载了 …

【JavaSE笔记】抽象类与接口

一、抽象类 1、概念 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c;如果一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类。 package demo2…

React 开发一个移动端项目(2)

配置基础路由 目标&#xff1a;配置登录页面的路由并显示在页面中 步骤&#xff1a; 安装路由&#xff1a; yarn add react-router-dom5.3.0 5 和 6 两个版本对组件类型的兼容性和函数组件支持有所改变&#xff0c;在这里使用的是 5。 和路由的类型声明文件 yarn add types…

AI AIgents时代-(三.)AutoGPT和AgentGPT

前两篇讲解了Agent的原理和组件&#xff0c;这节我将给大家介绍两个agent项目&#xff0c;给出它们的工作原理和区别&#xff0c;并教大家亲手尝试使用 Agents&#x1f389; &#x1f7e2; AutoGPT&#x1f916;️ 我们的老朋友&#xff0c;之前文章也专门写过。AutoGPT 是一…

关于硬盘质量大数据分析的思考

近日&#xff0c;看到Backblaze分享了一遍关于硬盘运行监控数据架构的文章&#xff0c;觉得挺有意义的&#xff0c;本文就针对这方面跟大家聊聊。 作为一家在2021年在美国纳斯达克上市的云端备份公司&#xff0c;Backblaze一直保持着对外定期发布HDD和SSD的故障率稳定性质量报告…

中国智能客服发展历程

中国智能客服的发展历程&#xff1a; 在2000年以前&#xff0c;互联网尚未普及&#xff0c;客服主要以电话沟通为主。从2000年到2010年&#xff0c;得益于计算机技术、计算机电话集成技术&#xff08;CTI&#xff09;、网络技术、多媒体机技术以及CRM、BI、ERP、OA等企业信息化…

Centos7部署单机版MongoDB

目录 Centos7部署单机版MongoDBMongoDB介绍数据模型索引分布式高可用性查询语言驱动和社区用途缺点 下载并解压安装包创建相关文件夹和文件编辑mongod.conf文件启动mongodb创建管理员用户终止MongoDB服务配置自启动服务关闭SELinux编辑自启动服务文件mongodb服务命令 Centos7部…

Primer.ai:分析总结并生成报告

【产品介绍】 名称 Primer.ai 上线时间 成立时间:2015年 具体描述 Primer.ai是一个新兴的人工智能企业&#xff0c;帮助用户处理大量文本数据存储。它使用机器学习技术帮助解析。Primer平台使用机器学习和自然语言处理来构建能够阅读文档、开发见解和生…

数据结构——散列函数、散列表

文章目录 前言一、散列表的基本概念二、散列函数的构造方法三、处理冲突的方法1. 开放定址法&#xff1a;2. 拉链法 四、散列查找及性能分析总结 前言 散列表的基本概念散列函数的构造方法处理冲突的方法散列查找及性能分析 提示&#xff1a;以下是本篇文章正文内容&#xff0…

C【动态内存管理】

1. 为什么存在动态内存分配 int val 20;//在栈空间上开辟四个字节 char arr[10] {0};//在栈空间上开辟10个字节的连续空间 2. 动态内存函数的介绍 2.1 malloc&#xff1a;stdlib.h void* malloc (size_t size); int* p (int*)malloc(40); #include <stdlib.h> #incl…

基于 kubernetes+docker构建高可用、高性能的 web 、CICD集群

文章目录 一、项目架构图二 、项目描述三、项目环境四、环境准备1、IP地址规划2、关闭selinux和firewall3、配置静态ip地址4、修改主机名5、升级系统&#xff08;可做可不做&#xff09;6、添加hosts解析 五、项目步骤1、设计整个集群的架构&#xff0c;规划好服务器的IP地址&a…

# 数据库开发-MySQL基础DDL-DML总结

数据库&#xff1a;英文为 DataBase&#xff0c;简称DB&#xff0c;它是存储和管理数据的仓库。 数据库管理系统&#xff08;DataBase Management System&#xff0c;简称DBMS&#xff09; DBMS是操作和管理数据库的大型软件。将来我们只需要操作这个软件&#xff0c;就可以通…