二叉树的基本运算

news2024/9/23 13:28:16

二叉树的基本运算

上一讲我们已经讲了创建二叉树,所以这一讲,我们来说一下二叉树的基本运算方法,为以后二叉树的运用打下基础:

(1)查找节点FindNode(*b,x):

在二叉树b中寻找data域值为x的节点,并返回指向该节点的指针

(2)找孩子节点LchildNode§Rchild-Node§:

分别求二叉树中节点*p的左孩子节点和右孩子节点.

(3)求高度BTNodeDepth(*b):

求二叉树b的高度.若二叉树为空,则其高度为0;否则,其高度等于左子树和右子树中的最大高度加一.

(4)输出二叉树DispBTNode(*b):

以括号表示法输出一颗二叉树.

image-20221206112126201

如上图,就是我们举的例子:

我们定义的二叉树节点结构如下:

typedef struct node
{
	ElemType data;
    struct node *lchild,*rchild;
}BTNode;

(1)查找节点 FindNode(*b,x)

•找到值为x的节点后返回节点指针,否则返回NULL

•用递归算法,采用"根-左子树-右子树"的顺序,查找值为x的节点.

查找思路:

我们先在同一层级上查找,因为我们每次都是处理 根、左、右节点,在同一层级上进行处理,至于同一层级的节点还有子树 , 我们就直接让他调用自身 , 我们先认为,他能够完成任务,因为每次重新调用我们都是把传入的节点当成一个树来进行操作,所以自然会返回我们想要的结果,我们目前要构建的就是当我们面对一颗传入的树,如何处理好其同一层级的节点.

①首先我们传入要查找的树根和要查找的值

BTNode *FindNode(BTNode *b,ElemType x)
{    

②然后我们定义每次查找对比的指针的节点

BTNode *p;

③如果传入的树,此时是空,说明我们什么也查找不到,就返回空,如果根结点就是要找的x,就返回其指针

if(b==NULL)
    return NULL;
else if(b->data==x)
    return b;

④如果根节点不是, 那就看其左子树和右子树有没有所要找的节点了,没有则返回空即可

else
{
    //看左子树返回的值有没有所要找的节点
	P=FindNode(b->lchild,x);
    //返回的不是空,就说明找到了
    if(p!=NULL)
    {
    	retrun p;
    } 
    //不然就是没找到,接着去找右子树,不管找不找得到,都返回即可,找到了返回其指针,找不到返回空
    else
    {
    	return FindNode(b->rchild,x);
    }          
}   

(2)找孩子节点LchildNode§RchildNode§

•直接返回 *p节点的左孩子或右孩子节点的指针.

image-20221206121709124

思路:我们构建的时候,就已经定义好了左孩子节点和右孩子节点,所以我们直接调用即可

//左孩子
BTNode *LchildNode(BTNode *p)
{
	return p->lchild;
}    
//右孩子
BTNode *RchildNode(BTNode *p)
{
	return p->rchild;
}   

(3)求高度*BTNodeDepth(b)

• 二叉树的高度的递归模型f()

image-20221206122556896

思路:

把同一层级的高度算出来,每递归返回一层,我们的高度都在原来基础上增1,因为我们是求树的高度,也就是最大高度,所以需要把左子树和右子树的高度做比较.至于左子树和右子树的高度怎么算,调用自身即可(其有可看成下一层级的子树)

下面开始代码实现:

//传入要求高度的树
int BTNodeDepth(BTNode *b)
{
	//定义本层级左子树和右子树的高度;
	int lchilddep,rchilddep;
    //根节点为空,则返回0
    if(b==NULL)
    {
    	return(0);
    }
    else
    {
    	//求左子树的高度
        lchilddep=BTNodeDepth(b->lchild);
        //求右子树的高度
        rchilddep=BTNodeDepth(b->rchild);
        //返回左子树和右子树较大的高度即可,在其基础上增一(因为要带上根节点)
        return (lchilddep>rchilddep)? (lchilddep+1):(rchilddep+1);
    }       
}   

(4)输出二叉树*DispBTNode(b)

•用括弧表示法输出二叉树.

•对于非空二叉树b

​ • 先输出其元素值

​ • 当存在左孩子或右孩子节点时

​ ①输出一个“(”符号

​ ②递归处理左子树

​ ③输出一个“,”符号

​ ④递归处理右子树

​ ⑤最后输出一个“)”符号

代码思路: 我们其实还是在同一层级上先构建一层节点,然后再递归调用输出其子树

下面开始代码构建:

//传入二叉树的根节点
void DispBTNode(BTNode *b)
{
	//先判断根节点是否为空,为空则跳出即可
    if(b!=NUll)
    {
    	//不为空,就先把头结点输出
        printf("%c",b->data);
        //如果接下来根节点还有孩子的话,最起码我们需要先输出一对括号
        if(b->lchild!=NULL||b->rchild!=NULL)
        {
        	printf("(");	//同一层级的左括号
            //接着我们把其左子树或右子树输出即可
            //先输出左子树,就是把左子树当做一个独立的树输出,因为我们已经在其外层套了括号
            DispBTNode(b->lchild);
            //接着看此层级是否有右子树,有的话,就输出个逗号,没有的话,就输出逗号加"#"号
            if(b->rchild!=NULL)
            {
            	printf(",");
                DispBTNode(b->rchild);
            }
            else
            {
            	printf(",#");
            }
            printf(")");	//同一层级的右括号
        }
    }
}    

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

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

相关文章

逆傅里叶变IFFT原始信号恢复方法研究-附Matlab代码

一、原始信号模拟 现实中,由于得到的信号都是实数序列。设有实数序列x(n),如下图所示 图1 原始信号 对应Matlab如下: %% 矩形波 N33; % 设置N长 xzeros(1,N); % 构成矩形波形 x(7:27)1; figur…

JavaSe-JAVA的多态

用一句话概括就是:事物在运行过程中存在不同的状态。先以教科书般举例说明,下文再举一个花木兰替父从军的例子帮助大家理解. 多态的存在有三个前提: 1.要有继承关系 2.子类要重写父类的方法 3.父类引用指向子类对, 但是其中又有很多细节需要注意。首先我们定义两…

java代码审计

java代码审计 SQL注入分析 1、JDBC 1、1(statement) public String jdbcVul(String id) {StringBuilder result new StringBuilder();try {Class.forName("com.mysql.cj.jdbc.Driver");Connection conn DriverManager.getConnection(db_u…

Qt OpenGL(二十六)——Qt OpenGL 核心模式-旋转的彩色三角形

Qt OpenGL(二十六)——Qt OpenGL 核心模式-旋转的彩色三角形 上篇文章我们把三角形上色成了,彩色的三角形: 离我们想要绘制的图形,旋转的三角形,又近了一步,本篇文章就让这个彩色的三角形旋转起来。不过从上篇开始使用的代码就是Qt封装的类了,不过也是核心模式的,步…

【Qt】从开源项目QCAD中学习如何增强QLineEdit控件

1 背景 Qt5 中有个很基本的单行输入框控件,就是 QLineEdit,类似于HTML中的input标签。 在QCAD开源项目中,其主界面中有个供用户输入绘图命令的单行输入框控件,其可以实现类似 Linux 终端的简单效果: 上键显示最近的…

基于jsp+ssm的家政服务系统-计算机毕业设计

项目介绍 作为一个家政服务系统,它就面对着许多用户的操作,而这些用户对系统的操作应该有所不同,所以我们在设计时必须要对不同的用户设立不同的的权限在本系统中,我考虑了3种权限(管理员,雇主&#xff0c…

盘点JDK中基于CAS实现的原子类

前言 JDK中提供了一系列的基于CAS实现的原子类,CAS 的全称是Compare-And-Swap,底层是lock cmpxchg指令,可以在单核和多核 CPU 下都能够保证比较交换的原子性。所以说,这些原子类都是线程安全的,而且是无锁并发&#x…

国内设计师经常逛的5个素材网站

设计师必备的5个设计素材网站,免费下载,还可商用,再也不用担心侵权了。1、菜鸟图库 https://www.sucai999.com/?vNTYwNDUx菜鸟图库是一个素材量非常丰富的网站,网站聚合了平面、UI、淘宝电商、高清背景图、图片、插画等高质量素材…

六 游戏基础知识和SHAPE

显示对象 在Egret渲染架构设计中,我们将能够参与渲染的对象抽象为显示对象 Egret引擎中所有的显示对象类型表格: 坐标系 egret游戏中的的坐标原点位于舞台的左上角 显示列表与容器类 所有的容器全部继承于 DisplayObjectContainer类 DisplayObje…

世界杯主题系列-用Scratch制作足球比赛小游戏,源码分享啦

目录 一:两个小游戏的预览图效果图: 二:简单版双人足球赛源码: 三:复杂多人控制版足球赛源码 先来动态gif效果图: 四年一度的世界杯正在卡塔尔火热进行中! 在绿茵场内,有胜利的…

Reids实战——分布式锁优化(Lua脚本)

1 基于Redis分布式锁的问题 先来看看之前分布式锁的实现。 这个基于Redis的分布式锁仍然有着一个问题,那就是误删锁的问题。 简单的来说,就是当第一个线程,也就是线程1,拿到锁后,但由于本身业务复杂,而导…

gvim写verilog环境搭建——将文本编辑器客制化定义为你自己的IDE

本文将详细描述将vim变成写Verilog代码的IDE客制化的实现过程,同时最后提供自己的环境。实现的过程中有使用自己写的,也有参考借鉴其他同学进行一定的修改,也有直接使用插件实现的相关功能。对应的功能实现部分均会给出相应的参考与插件地址等…

基于jsp+ssm的网上图书商城-计算机毕业设计

项目介绍 本系统的用户群体分为管理员、会员两类。不同的身份拥有不同的职责和权限。管理员的职能包括:图书管理、会员管理、订单信息审核、个人信息维护等 该网上书城系统应该具备有图书添加、图书信息修改、用户浏览图书、用户搜索图书、图书购买和订购等功能&a…

为什么在高速PCB设计当中信号线不能多次换孔

大家在进行PCB设计时过孔肯定是要接触的,那么大家知道过孔对于我们PCB的信号质量影响有多大吗? 在搞清楚上面这个这个问题之前我们先给大家介绍一下我们在PCB设计时过孔应该如何选取。 一般过孔种类有以下三种可以进行选择:(单位是…

00后会不会改变软件测试行业现状?

不可置否,从年开始,00后开始进入职场,开始他们漫长的职业生涯啦。 作为经历过90后改变职场规则的80后的老人们,又要瑟瑟发抖啦。 因为在90后之后,00后又开始整顿职场了。 80后,上有老下有小,为…

纪念DedeCMS创始人IT柏拉图先生

我是卢松松,点点上面的头像,欢迎关注我哦! IT柏拉图开发了DedeCMS,造福了千万站长,但却没有因为这套系统过上体面的生活。 (图片取自IT柏拉图的新浪微博) 1979年你出生了,比我大…

【刷题心得】双指针法|HashSet<T>

题目 1 概念梳理 1.1 ISet<T> HashSet<T> 包含不重复元素的集合称为“集set”。.NET Framework包含两个集HashSet<T>和SortedSet<T>&#xff0c;其中HashSet<T>包含不重复元素的无序列表&#xff0c;SortedSet<T>包含不重复元素的有序列…

数据科学必备Python编程基础

前言 对于Python复杂的编程语言中提取了数据分析常用的数据处理以及数据可视化等数据分析师常用的内容&#xff0c;区别与其他的Python编程教程&#xff0c;如果是纯开发的小伙伴&#xff0c;看完本系列的文章仅仅只能掌握数据相关处理的内容&#xff0c;并不能完全掌握开发方…

RestoreDet

来说说低分辨率图像中目标检测吧~~ 超分辨率&#xff08;SR&#xff09;等图像恢复算法是退化图像中目标检测不可或缺的预处理模块。然而&#xff0c;这些算法中的大多数假设退化是固定的并且是先验已知的。 论文地址&#xff1a;https://arxiv.org/pdf/2201.02314.pdf 当真…

四、文件管理(三)文件系统

目录 3.1文件系统结构 3.2文件系统布局 3.2.1文件系统在外存中的结构 3.2.2文件系统在内存中的结构 3.3外存空闲空间管理 3.3.1空闲表法 3.3.2空闲链表法 3.3.3位示图法 3.3.4成组链接法 3.4虚拟文件系统 3.5文件系统挂载(mounting) 3.1文件系统结构 从不同的角度出…