Day 6. 二叉数:满二叉树、完全二叉树

顺序表、链式表、栈、队列:线性——一对一的结构

树形结构(一对多)

叶子节点(终端结点):只有前驱没有后继结点

深度(树的度):树中各节点度的最大值 

广度:从根节点到最底层节点的层数

节点度:子节点的个数称之为度

二叉树

满二叉树:在不增加层数的情况选无法在增加一个结点

K层满二叉树:第K层结点个数:2^(K-1)

                        K层结点总个数:2^K-1

知道总的结点数求叶子节点的个数:

1)、求出最外层的节点数num;求出倒数第二层的被占用的节点数pnum = num/2;求出倒数第二层的节点数p;   叶子节点数: num+(p - pnum)。

2)、总节点数 - 总结点数/2。

完全二叉树:想增加结点必须从上到下、从左到右依次增加;想删除结点必须从右向左、从下向上依次删除。

遍历:(前三种是深度优先;最后一种是广度与优先)

前序遍历: 根节点——左子树——右子树

中序遍历:左子树——根——右子树

后序遍历:左子树——右子树——根

层序遍历:从上到下——从左至右——逐层遍历

.h文件

#ifndef __TREE_H_
#define __TREE_H_typedef char BDATA_TYPE;typedef struct tree_node
{BDATA_TYPE data;struct tree_node *pl;     //指向左子树的指针struct tree_node *pr;     //指向右子树的指针}TREE_NODE;extern TREE_NODE *create_Btree();   //创建
extern void pre_order(TREE_NODE *pnode);  //遍历(前序)
extern void in_order(TREE_NODE *pnode);   //遍历(中序)
extern void post_order(TREE_NODE *pnode);  //遍历(后序)
extern int Number_of_nodes(TREE_NODE *pnode);   //获得二叉树的结点数
extern int Number_of_layers(TREE_NODE *pnode);   //获取二叉树的层数
extern void destroy_tree(TREE_NODE *pnode);   //销毁二叉树
extern int floor_order(TREE_NODE *pnode);    //遍历(层序)#endif

创建一颗二叉树

/* 创建一颗二叉树 (前序的方式) *     根---左---右      */
TREE_NODE *create_Btree()
{TREE_NODE *pnode = NULL;BDATA_TYPE data = 0;data = tree[idx++];       //依次获取数组中的元素if ('#' == data)          //如果获取到的是# 则返回NULL{return NULL;}pnode = malloc(sizeof(TREE_NODE));     //创建一个结点空间if (NULL == pnode){perror("fail to malloc");return NULL;}pnode->data = data;      //将获取到的数据赋值到数据域中pnode->pl = create_Btree();   //先指向左子树递归调用pnode->pr = create_Btree();   //再指向右子树递归调用return pnode;}

遍历(深度优先、三种)

/* 遍历  (前序) */
void pre_order(TREE_NODE *pnode)
{if (NULL == pnode)   //如果遍历到空 {return ;}printf("%c", pnode->data);  //先打印出根pre_order(pnode->pl);   //继续递归遍历左子树pre_order(pnode->pr);   //在递归遍历右子树}/* 遍历 (中序) * 左---根---右 */
void in_order(TREE_NODE *pnode)
{if (NULL == pnode){return ;}in_order(pnode->pl);printf("%c", pnode->data);in_order(pnode->pr);
}/* 遍历 (后序)* 左---右---根 */
void post_order(TREE_NODE *pnode)
{if (NULL == pnode){return ;}post_order(pnode->pl);post_order(pnode->pr);printf("%c", pnode->data);}

获取二叉树的结点个数

/* 获取二叉树的结点个数 */
int Number_of_nodes(TREE_NODE *pnode)
{if (NULL == pnode){return 0;}return 1 + Number_of_nodes(pnode->pl) + Number_of_nodes(pnode->pr);    //递归依次记录左右子树的结点数}

获取二叉树的层数

/* 获取二叉树的层数 */
int Number_of_layers(TREE_NODE *pnode)
{if (NULL == pnode){return 0;}int layL = Number_of_layers(pnode->pl);      //递归调用记录左子树的层数int layR = Number_of_layers(pnode->pr);      //递归调用记录右子树的层数return layL > layR ? layL + 1 : layR + 1;     //左右层数比较 返回数量多的}

销毁二叉树

/* 销毁二叉树 */
void destroy_tree(TREE_NODE *pnode)
{if (NULL == pnode){return ;}destroy_tree(pnode->pl);destroy_tree(pnode->pr);free(pnode);
}

层序遍历——用到了顺序队列

/* 遍历 (层序)* 从上到下 从左到右 */
int floor_order(TREE_NODE *pnode)
{QUEUE_LIST *pque = NULL;QUEUE_ONDE *prot = NULL;DATA_TYPE outdata = 0;pque = create_linked();       //创建链式队列if (NULL == pque){return -1;}prot = create_node(pnode);     //往队列中添加数据(结点的地址)Tail_Plug_List(pque, prot);     //插入队列while(!is_empty_link(pque))      //只要队列不为空{Head_Delete(pque, &outdata);   //出列(先入先出)printf("%c", outdata->data);   //打印地址所指向的数据域的数据if (NULL != outdata->pl)       //左子树不为空{prot = create_node(outdata->pl);Tail_Plug_List(pque, prot);}if (NULL != outdata->pr)  //右子树不为空{prot = create_node(outdata->pr);Tail_Plug_List(pque, prot);}}Destroy_Queue(pque);return 0;}

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

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

相关文章

优化选址问题 | 基于鹈鹕算法求解基站选址问题含Matlab源码

目录 问题代码问题 鹈鹕算法(Pelican Optimization Algorithm, POA)是一种相对较新的启发式优化算法,模拟了鹈鹕鸟觅食的行为。这种算法通常用于解决复杂的优化问题,如函数优化、路径规划、调度问题等。基站选址问题通常是一个复杂的优化问题,需要考虑覆盖范围、干扰、成…

Java中的this关键字的内存图

在Java中,this关键字用于引用当前对象。它可以在实例方法和构造方法中使用,表示对当前对象的引用。 要理解this关键字的内存图,我们需要了解Java中对象的内存分配方式。当创建一个对象时,Java会在堆内存中分配一块内存空间来存储…

阿里云ECS服务器u1通用算力型CPU性能如何?

阿里云服务器u1是通用算力型云服务器,CPU采用2.5 GHz主频的Intel(R) Xeon(R) Platinum处理器,通用算力型u1云服务器不适用于游戏和高频交易等需要极致性能的应用场景及对业务性能一致性有强诉求的应用场景(比如业务HA场景主备机需要性能一致)&#xff0c…

LAMP架构与搭建论坛

目录 1、LAMP架构简述 2、各组件作用 3、构建LAMP平台 3.1编译安装Apache httpd服务 3.1.1关闭防火墙,将安装Apache所需软件包传到/opt目录下 3.1.2安装环境依赖包 3.1.3配置 设置安装目录、安装模块 3.1.4编译安装 3.1.5优化配置文件路径 3.1.6启动apache…

【机器学习300问】45、什么是推荐系统?

我想大家对于推荐系统都能或多或少的讲出一些,因为现在的广告厂商真是想方设法的把他们的产品推送到我们面前来,让我们看到并产生购买的欲望! 推荐系统就像是一位超级贴心的私人购物顾问或者智能娱乐向导 想象一下你走进一家巨大的网上商城或…

北航计算机软件技术基础课程作业笔记【1】

为白成刚老师的课程&#xff0c;简单做一个记录&#xff0c;内容偏基础&#xff0c;自己仅保留认为有用的部分 L1&#xff1a;算法概论 课程简单介绍了复杂度、算法的概念 1.作业 计算下列各片断程序中xx1的执行次数 (1) for (i1; i<n; i)for (j1; i<n; j)for (k1; …

牛客小白月赛89补题1(ABCD)(偏难)

评价&#xff1a; 高情商&#xff1a;收获很大 &#xff0c;让自己进一步认清自己。 低情商&#xff1a;题目难&#xff0c;自己太菜了。 今天还有一些其他事&#xff0c;剩下的题明天再补。 我们从a题开始吧&#xff1a; A.签到 我们只要看看其中的max与min是否不符合即可…

Android14之selinux报错:ERROR: end of file in comment(一百九十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

项目成功秘诀:高效管理策略确保按时交付v2

一、项目成功的重要性 在当今竞争激烈的商业环境中&#xff0c;项目的成功对于企业的生存和发展具有至关重要的意义。项目的成功不仅意味着企业能够达成既定的业务目标&#xff0c;还能提升企业的市场地位、增强品牌影响力&#xff0c;并为企业的可持续发展奠定坚实基础。我们…

eMule 中的“低 ID”(Low id)

在 eMule 中&#xff0c;“低 ID”是指 eDonkey 网络内的客户端 ID 被归类为“低”的情况。 这种分类表明客户端的连接有一定的限制或限制。 在 eMule 中&#xff0c;ID 较低可能会影响用户连接到其他客户端的能力&#xff0c;并可能导致下载速度变慢或出现其他网络问题。 eMu…

中型企业网络路由器配置(ensp)实验

vlan、vlan间路由、ospf协议等来实现三层交换机和单臂路由之间的通信 拓扑图&#xff1a; 1. 配置三层交换机vlan和vlan间路由 SW1 #进入视图 sys sysn sw1 undo info-center enable#配置vlan vlan batch 10 20 30 40 50 60#配置access口 int g0/0/1 port link-type access …

vuetify3 弹窗中使用 element-plus 时间控件异常解决

1、解决方案: v-dialog 标签加上3个属性&#xff1a; 1、persistent &#xff1a;禁用点击窗口外的关闭事件 2、no-click-animation&#xff1a;禁用点击动画 3、retain-focus&#xff1a;取消焦点事件 2、填报弹窗基本代码&#xff1a; 就看 v-dialog 标签属性就行&#xf…

【Qt5】QVariant

2024年3月22日&#xff0c;周五下午 什么是QVariant QVariant 是 Qt 框架中用于处理各种数据类型的通用类。它可以存储几乎任何类型的数据&#xff0c;并且能够在不同的 Qt 类之间进行类型转换。QVariant 在 Qt 中被广泛用于处理不同的数据类型&#xff0c;包括基本数据类型&a…

Python Using cached demjson-2.2.4.tar.gz (131 kB)...报错

安装demjson报错&#xff0c;提示Using cached demjson-2.2.4.tar.gz (131 kB)...... 解决办法 使用pip list查看&#xff0c;发现是setuptools版本过高导致&#xff0c;这里我使用的是45.2版本 pip uninstall setuptools pip install setuptools45.2 pip install demjson …

ChatGPT提示词大全:解锁AI对话

2024升级ChatGPTPLUS最快的方法 一、什么是ChatGPT提示词&#xff1f; ChatGPT提示词是用户在与ChatGPT进行对话时&#xff0c;提供的一些关键词或短语&#xff0c;用于引导ChatGPT的回答方向和内容。通过合理的提示词设置&#xff0c;用户可以更加精确地获取所需信息&#x…

HBase的Bulk Load流程

目录 1. 数据准备 2. 文件移动 3. 加载数据 4. Region处理 5. 元数据更新 6. 完成加载 7. 清理 8. 异常处理 LoadIncrementalHFiles&#xff08;也称为Bulk Load&#xff09;是HBase中一种将大量数据高效导入到HBase表的机制。以下是LoadIncrementalHFiles的主要流程步…

视觉信息处理和FPGA实现第6次作业-Matlab实现灰度图像的亮度调节

一、代码 close all;clear all;clc; pic imread("cameraman.tif"); [M,N] size(pic); disp("Contrast Ajust Demo"); value input("Please input number of value, range: 0~2\n"); while value>2 || value<0disp("The number is in…

Springboot集成jersey打包jar找不到class处理

环境 java17 springboot 3.x 如题&#xff0c;简单来说&#xff0c;jersey官方希望用户通过 register 的方式&#xff0c;将所有的资源类注册到jersey中&#xff0c;但是&#xff0c;一般开发中&#xff0c;可能定义了N个Resource类&#xff0c;一个一个的加入&#xff0c;太…

python--for循环

for循环&#xff1a; python中的for循环是用来迭代容器中的每一个元素的&#xff0c;而不是c,java中理解那个循环&#xff1b; for 零时变量 in 容器&#xff1a; print&#xff08;零时变量&#xff09; #每一个迭代出的元素 range 全局函数&#xff1a; …