一篇文章教你学会二叉树的链表实现及其oj题(附源码)

前言

前面我们通过堆实现了二叉树,接下来我们用链表实现二叉树。

1. 实现链式结构二叉树

1.1 结构体定义

二叉树的每个结点需要两个指针,分别指向其左孩子和右孩子。还有一个结点域,存储数据。

还是将数据类型重命名,便于后面更改。一个结构体指针指向左孩子,另一个指向右孩子。

1.2 申请结点

由于二叉树的结点都是动态申请的,需要多次,因此我们将它封装为函数便于使用。

先动态申请结点大小的内存,然后判断是否为空,不为空则对其进行初始化,一开始将左右指针都指向空,将数据赋值,最后返回新结点。

1.3 二叉树构建

通过如上代码,我们现实了一个简单二叉树。二叉树如下图:

1.4 求二叉树结点个数

我们通过递归的方式求结点个数,二叉树的很多功能都是用递归实现,二叉树就是关于递归的暴力美学。

如果结点为空,则返回0停止递归,否则就进行递归,返回本身的结点树和左子树的结点数以及右子树的结点数。

分析:当传入第一个结点的时候,结点不为空,则进入递归,到一号结点的左节点及二号结点,该结点不为空,进入递归,到四号结点,四号结点不为空,进入递归,而四号结点的左子树为空,返回0,然后进入四号结点的右子树,也返回0。然后到四号结点,返回1。再到二号结点的右子树,跟四号结点是一种情况,返回1。再到二号结点,返回3。再到三号结点,与四号结点类似,返回1,最后到一号结点,返回5。

1.5 求某层结点的个数

我们知道了某层的层次k,就可以通过一个if循环来判断该结点个数。

k表示第几层,当k不为1时不进行计数,只有当k为1时才进行记录个数。返回的是该结点的左子树和右子树在k层的结点个数。如果没达到k层就为空了,则不计数。

1.6 求叶子结点个数

叶子结点的特征就是左子树和右子树都为NULL,所以如果遇到这样的结点则计数,否则不计数。

1.7 查找值为x的结点

递归结点的左右子树,如果碰到值相等的则返回这个结点,如果一直没遇到则返回空。

通过if递归左右子树。

1.8 求二叉树的层次

我们知道,如果是完全二叉树,则左子树层次一定比右子树的层次深。所以我们递归左子树就可以了。

1.9 二叉树销毁

遍历二叉树,将每个结点都置free并置为空。因为要遍历二叉树,所以不能从根结点开始销毁,如果销毁了就找不到其他的结点了。

因为会销毁头结点,所以需要用到二级指针。

1.10 二叉树层次遍历

层次遍历需要通过队列来实现。

思路:将根结点放入队列中,然后将根结点取出并打印,将根结点的左右不为空的结点放入队列,再依次取出并打印,再放入其左右非空结点。直到队列为空。

这里需要注意,由于需要用到队列,我们需要创建并初始化队列,最后将队列进行销毁。

1.11 判断是否为完全二叉树

判断完全二叉树也需要队列进行判断。

思路:跟层次遍历一样,需要通过反复的取出结点并放入子结点,但不同的是,除非结点为空,否则其左右结点都需要放入队列。当取出到空结点的时候便不再进行取放操作,然后判断队列元素是否全为空,如果为空则是完全二叉树,如果不为空就不是完全二叉树。

注意:在返回false的时候也需要销毁队列。

2. oj题

2.1 单值二叉树

思路:如果根结点的左右子树与根结点的值相同,那么左右子树就可以单独再与其左右子树进行判断,进行递归。

注意:当递归到空结点的时候,这个时候返回true,因为空结点不影响结果。

如果遇到一个不相同的值便可以返回false了,最后将根结点的左右子树结果进行&&操作,只有两个子树都为true时这棵树才是单值二叉树。

代码如下:

2.2 检查两颗二叉树是否相同

思路:判断两个二叉树的头结点是否相同,如果相同则进行左右子树递归,不同则返回false,相同则不管,最后当空结点的时候返回true。

注意:当两颗二叉树都为空,是相同二叉树,当只有其中一颗为空时则不相同。

代码如下:

2.3 轴对称树

思路:可以借助上一题实现的相同树,只需要稍微修改,即将根结点的左子树与右子树进行判断是否相等。

代码如下:

2.4 另一棵树的子树

思路:还是借助相同树。从头结点开始判断两棵树是否相同,然后遍历所有结点,只要有一颗树相同就行。

注意:递归的时候return是使用 || 。

代码如下:

2.5 二叉树的构建即遍历

思路:通过递归进行构建二叉树。因为给先序遍历,即“根左右”。因此第一个是根结点,第二个是根结点的左结点,也是左子树的根结点。如果再读到一个不为空的值,那肯定是第二个结点的左结点,依次下去。直到读到两个为空的符号时这个结点便结束了,返回这个结点的根结点,再进行该根结点的右子树的创建,但是需要注意根结点的创建也是从左子树开始创建的。当读到一个为空的符号时,代表该结点的左子树结束,创建该结点的右子树。

因此递归的终止条件是读到为空的符号。

代码如下:

#include <stdio.h>

#include <stdlib.h>

//1.

typedef char btdatatype;

typedef struct btnode{

    struct btnode * left ;

    struct btnode* right;

    btdatatype val;

}btnode;

btnode * buynode(char x)

{

    btnode * newnode = (btnode *)malloc(sizeof(btnode));

    newnode->val =x;

    newnode->left = newnode->right = NULL;

    return newnode;

}

btnode * create(char * arr,int * pi)

{

    if(arr[*pi]=='#')

    {++(*pi);

        return NULL;}

    btnode * root = buynode(arr[*pi]);

    ++(*pi);

   root->left =  create(arr,pi);

   root->right= create(arr,pi);

   return root;

}

void inorder(btnode * root)

{

    if(root==NULL)

    return ;

    inorder(root->left);

    printf("%c ",root->val);

    inorder(root->right);


 

}

int main() {

   char arr[100];

   scanf("%s ",arr);

   int i =0;

   btnode * root = create(arr,&i);

   inorder(root);

    return 0;

}

具体实现的时候需要申请结点以及进行中序遍历,中序遍历比较简单,这里就不讲了。

3.源码

二叉树的实现以及判断完全二叉树,层次遍历 · a36cc5b · 重邮阿江/c_study_experience - Gitee.com二叉树oj题 · 7452d90 · 重邮阿江/c_study_experience - Gitee.com

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaEE】通过Linux部署Web项目到云服务器上

一.配置部署所需的环境. 1.1 什么是部署? 要想知道什么是部署, 就要先了解我们在日常开发的过程中所设计到的几种环境: 开发环境: 软件开发环境指的是开发人员在创建、测试和部署软件应用程序时所需的一系列硬件、软件、工具和流程的集合。它是为了支持软件开发过程而构建的…

文件包含漏洞--pyload

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.PHP伪协议利用 php://协议 php://filter &#xff1a;用于在读取作用和写入文件时进行过滤和转换操作。 作用1&#xff1a;利用base64编码过滤器读取源码 通常利用文件包含执行php://filte…

哈希表专题

题解之前&#xff1a; 1.有关unordered_map的count功能&#xff1a;查询key&#xff01; Leetcode 1.两数之和 解题思路&#xff1a; class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> res;// key:具体的数值(便…

【计算机毕业设计】838装修公司CRM系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

c# - - - ASP.NET Core 网页样式丢失,样式不对

c# - - - ASP.NET Core 网页样式丢失&#xff0c;样式不对 问题 正常样式是这样的。 修改项目名后&#xff0c;样式就变成这样了。底部的内容跑到中间了。 解决 重新生成解决方案&#xff0c;然后发布网站。 原因&#xff1a; 修改项目名之前的 div 上有个这个自定义属…

大数据采集工具——Flume简介安装配置使用教程

Flume简介&安装配置&使用教程 1、Flume简介 一&#xff1a;概要 Flume 是一个可配置、可靠、高可用的大数据采集工具&#xff0c;主要用于将大量的数据从各种数据源&#xff08;如日志文件、数据库、本地磁盘等&#xff09;采集到数据存储系统&#xff08;主要为Had…

React Native在移动端落地实践

在移动互联网产品迅猛发展的今天&#xff0c;技术的不断创新使得企业越来越注重降低成本、提升效率。为了在有限的开发资源下迅速推出高质量、用户体验好的产品&#xff0c;以实现公司发展&#xff0c;业界催生了许多移动端跨平台解决方案。这些方案不仅简化了开发流程&#xf…

C#基于SkiaSharp实现印章管理(5)

印章中最常见的特殊形状通常是五角星&#xff0c;空心、实心的都可能存在&#xff0c;本文学习并实现在印章内部绘制五角星形状。   百度五角星的绘制方法&#xff0c;主要分为三种&#xff1a;   1&#xff09;五角星各点坐标固定&#xff0c;直接调用编程语言的绘制线条或…

校车购票小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;我的乘车信息管理&#xff0c;车辆信息管理&#xff0c;座位管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;车辆信息&#xff0c;我的 开发系统…

推荐一款专注批量推送消息的轻量工具,支持主流平台的消息推送,简单、高效、低成本(附源码)

前言 在数字化时代&#xff0c;企业和个人面临着日益增长的消息推送需求。然而&#xff0c;现有的推送处理方案往往存在一些挑战和不足&#xff0c;如cao作复杂、成本高昂、缺乏灵活性等。这些问题不仅影响了推送效率&#xff0c;也增加了用户的负担。此外&#xff0c;随着工作…

SpringCloud+Vue3主子表插入数据(芋道)

目的&#xff1a;多表联查获取到每个班级里面所有的学生上课的信息。点击消课插入到消课主表和消课子表&#xff0c;主表记录班级信息&#xff0c;消课人员信息&#xff0c;上课时间。子表记录上课学员的信息&#xff0c;学员姓名、手机号、班级名称、班级类型、上课时间、老师…

词的向量化和文本向量化

词的向量化和文本向量化 向量化one-hot编码提前准备词表不提前准备词表one-hot缺点 词向量简介词向量的定义和目标word embedding和word vector的区别onehot编码与词向量关系构建 训练方式1&#xff08;基于语言模型&#xff09;训练方式2&#xff08;基于窗口&#xff09;CBOW…

Javascript前端面试基础(八)

window.onload和$(document).ready区别 window.onload()方法是必须等到页面内包括图片的所有元素加载完毕后才能执行$(document).ready()是DOM结构绘制完毕后就执行&#xff0c;不必等到加载完毕 window.onload 触发时机&#xff1a;window.onload 事件会在整个页面&#xf…

[css3] 如何设置边框颜色渐变

div {border: 4px solid;border-image: linear-gradient(to right, #8f41e9, #578aef) 1; }参考&#xff1a; 5种CSS实现渐变色边框&#xff08;Gradient borders方法的汇总

银行贷款信用评分不足?大数据帮你找回失去的“分”

在这个信息爆炸的时代&#xff0c;无论是个人还是企业&#xff0c;数据都成为了衡量信用和评估风险的重要依据。贷款、融资、求职甚至是日常消费&#xff0c;都可能因为一份好的数据报告而变得更加顺畅。那么&#xff0c;如何高效地查询自己的大数据&#xff0c;面对评分不足时…

文件上传漏洞(ctfshow web151-161)

Web151 F12修改源代码 exts后面png改为php 这样就可以上传php的文件了 Web152&#xff1a; 考点&#xff1a;后端不能单一校验 就是要传图片格式&#xff0c;抓个包传个png的图片 然后bp抓包修改php后缀解析 然后放包 Web153-web156 在php代码中可以使用“{}”代替“[]” …

uniapp时间戳转时间

时间戳转时间 utils页面 function timestampToTime(time) { const date new Date(time); const year date.getFullYear(); const month String(date.getMonth() 1).padStart(2, 0); // 月份从0开始&#xff0c;所以要加1&#xff0c;并补齐0 const day String(date…

尚庭公寓(五)

图片上传管理 由于公寓、房间等实体均包含图片信息&#xff0c;所以在新增或修改公寓、房间信息时&#xff0c;需要上传图片&#xff0c;因此我们需要实现一个上传图片的接口。 **1. 图片上传流程** 下图展示了新增房间或公寓时&#xff0c;上传图片的流程。 可以看出图片上传…

深度学习Week21——学习DenseNet算法

文章目录 深度学习Week21——学习DenseNet算法 一、前言 二、我的环境 三、学习DenseNet算法 四、代码复现 4.1 配置数据集 4.2 构建模型 五、模型应用与评估 5.1 编写训练函数 5.2 编写测试函数 5.3 训练模型 5.4 结果可视化 一、前言 &#x1f368; 本文为&#x1f517;365天…

第一个设计模式——单例模式

目录 一、特点&#xff1a; 二、实现单例模式步骤 三、饿汉式 四、懒汉式 五、双重检查锁 六、静态内部类 七、枚举 八、可能被反序列化和反射破坏什么意思&#xff1f; 九、如何解决呢&#xff1f; 一、特点&#xff1a; 唯一性&#xff0c;单例模式确保程序中只有一…