数据结构day7(2023.7.23)

一、Xmind整理:

二、课上练习:

练习1:结点之间的关系

练习2:二叉树的特殊形态

练习3:满二叉树的形态

  

练习4:完全二叉树的形态

满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树

练习5:二叉树的性质与结点的计算

练习6:在一棵度为3的树中,度为3的结点数为2个,度为2的结点数为1个,度为1的结点数为2个,则度为0的结点数不可能为(BCD)个

A、6                         B、7                         C、4                         D、5

答:根据公式可得:n=3*n3+2*n2+1*n1+1=3*2+2*1+1*2+1=11

                                 n=n0+n1+n2+n3 --> n0=n-n1-n2-n3

                                                                      =11-2-1-2

                                                                      =6

已求得度为0的结点数为6个,所以不可能的便是BCD。

练习7:设树T的度为4,其中度为1,2,3和4的结点个数分别为4,2,2,1,则T中的叶子数不可能是(ABC)

A、5                         B、8                         C、6                        D、10

答:根据公式可得:n=4*n4+3*n3+2*n2+1*n1+1=4*1+3*2+2*2+1*4+1=19

                                 n=n0+n1+n2+n3+n4 --> n0=n-n1-n2-n3-n4

                                                                            =19-4-2-2-1                                                                                                                                =10

已求得度为0的结点数为10个(即叶子数为10),所以不可能的便是ABC。

练习8:深度为5的完全二叉树最少有多少个结点(C)

A、32                         B、16                         C、31                         D、15

答:对于深度为k的完全二叉树,最少的结点数为2^k - 1。因此,深度为5的完全二叉树最少有2^5 - 1 = 31个结点。所以,深度为5的完全二叉树最少有31个结点。

练习9:已知一棵完全二叉树有500个结点,则这棵树的深度是(D)

A、7                         B、8                         C、10                        D、9

答:如果一棵完全二叉树具有500个结点,我们需要找到这棵树的深度。在一个完全二叉树中,有n个结点的深度可以通过以下公式计算:

对于这个问题,我们有500个节点,所以计算深度的公式为:

k = log2(500) ≈ log2(500) ≈ 8-9(8以上,不到9)

由于深度必须是整数,我们向下取整得到深度为8,再对8+1=9

因此,这棵树的深度为9。

练习10:若有一棵有16个结点的完全二叉树按层编号,则对于编号为7的结点X,它的双亲结点及右孩子结点的编号分别为(B)

A、2,15                         B、3,15                         C、2,14                        D、3,14

答:在一棵按层编号的完全二叉树中,对于编号为X的结点,其双亲结点的编号为X/2,右孩子结点的编号为2X+1。对于编号为7的结点X,可以根据上述规则计算:

双亲结点的编号:7/2 = 3.5,由于结点编号为整数,所以取下整,即双亲结点的编号为3。

右孩子结点的编号:2 * 7 + 1 = 15。

因此,编号为7的结点X的双亲结点的编号为3,右孩子结点的编号为15。

练习11:一个具有63个结点的二叉树的高H的值可能是(ABD)

A、63                         B、10                         C、5                        D、6

答:如果一棵二叉树具有63个结点,我们需要找到这棵树的深度。在一个完全二叉树中,有n个结点的深度可以通过以下公式计算:

对于这个问题,我们有63个节点,所以计算深度的公式为:

k = log2(63) ≈ log2(63) ≈ 5-6(5以上,不到6)

由于深度必须是整数,我们向下取整得到深度为5,再对5+1=6

因此,具有63个结点的二叉树的高度H的可能值在6到63之间。

综上所述,具有63个结点的二叉树的高度H的值可以是6到63之间的任何整数值。

练习12:已知一棵完全二叉树有5层,则第5层最少和最多分别有(A)个结点

A、1,16                         B、2,15                         C、1,31                        D、1,17

答:在一棵完全二叉树中,k层的结点个数最少为2^(k-1),最多为2^k-1。

根据题目给出的信息,完全二叉树有5层。

5层的结点个数最少为2^(5-1) = 2^4 = 16个。

5层的结点个数最多为2^5-1 = 2^5 - 1 = 31个。

前四层的结点个数为:2^4-1=15个

所以第5层最少:16-15=1     最多:31-15=16

因此,第5层最少有1个节点,最多有16个节点。

练习13:二叉树的存储形式

练习14:已知遍历结果如下,试画出对应的二叉树

               前序:A B C E H F I J D G K

               中序:A H E C I F J B D K G

练习15:已知树的先序遍历是GDAFEMHZ,中序遍历是ADEFGHMZ,则后序遍历的结果是(C)

A、AEFDMZHG          B、ADFEHZMG         C、AEFDHZMG         D、AMZHEFDG

 

练习16:已知某二叉树的后序遍历序列是dabec,中序遍历序列是debac,它的先序遍历是(B)

A、acbed                  B、cedba                 C、decab                  D、deabc

 

练习17:二叉树输入和还原

 

练习18:二叉树创建

练习19:二叉树先序遍历

 

练习20:二叉树中序遍历

 

练习21:二叉树后序遍历

 

练习22:计算各节点的个数

void Count(Btree tree,int *n0,int *n1,int *n2)
{
    if(tree==NULL)
    return;
    
    if(tree->lchild==NULL && tree->rchild==NULL)
    (*n0)++;//++*n0
    else if(tree->lchild!=NULL && tree->rchild!=NULL)
    (*n2)++;
    else
    (*n1)++;
    Count(tree->lchild,n0,n1,n2);
    Count(tree->rchild,n0,n1,n2);
}

练习23:计算树的深度

int High(Btree tree)
{
    if(tree==NULL)
        return 0;

    int left=High(tree->lchild)+1;
    int right=High(tree->rchild)+1;
    return left>right?left:right;
}

练习24:释放二叉树空间

void free_space(Btree tree)
{
    if(tree==NULL)
        return ;

    free_space(tree->lchild);
    free_space(tree->rchild);
    free(tree);
    tree=NULL;
}

二叉树的整体代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef char datatype;
typedef struct Node
{
	//数据域
	datatype data;
	//左孩子
	struct Node *lchild;

	//右孩子
	struct Node *rchild;
}*Btree;
/*
 * function:    创建二叉树
 * @param [ in] 
 * @param [out] 
 * @return      返回二叉树的根节点地址
 */
Btree create_tree()
{
	datatype e;
	printf("please enter tree data:");
	scanf(" %c",&e);
	if(e=='#')
		return NULL;

	
	Btree tree=(Btree)malloc(sizeof(struct Node));
	if(tree==NULL)
		return NULL;
	tree->data=e;//给节点的数据域赋值
	//递归创建左孩子
	puts("左孩子");
	tree->lchild=create_tree();
	//递归创建右孩子
	puts("右孩子");
	tree->rchild=create_tree();
	return tree;
}
/*
 * function:    先序遍历
 * @param [ in] 
 * @param [out] 
 * @return      
 */
void first_output(Btree tree)
{
	if(tree==NULL)
		return;
	printf("%c\t",tree->data);
	//递归遍历左孩子
	first_output(tree->lchild);
	//递归遍历右孩子
	first_output(tree->rchild);
}
/*
 * function:    中序遍历
 * @param [ in] 
 * @param [out] 
 * @return      
 */
void mid_output(Btree tree)
{
	if(tree==NULL)
		return;
	//递归遍历左孩子
	mid_output(tree->lchild);
	printf("%c\t",tree->data);
	//递归遍历右孩子
	mid_output(tree->rchild);
}
/*
 * function:    后续遍历
 * @param [ in] 
 * @param [out] 
 * @return      
 */
void last_output(Btree tree)
{
	if(tree==NULL)
		return;
	//递归遍历左孩子
	last_output(tree->lchild);
	//递归遍历右孩子
	last_output(tree->rchild);
	printf("%c\t",tree->data);
}
void Count(Btree tree,int *n0,int *n1,int *n2)
{
	if(tree==NULL)
		return;
	
	if(tree->lchild==NULL && tree->rchild==NULL)
		(*n0)++;//++*n0
	else if(tree->lchild!=NULL && tree->rchild!=NULL)
		(*n2)++;
	else
		(*n1)++;
	Count(tree->lchild,n0,n1,n2);
	Count(tree->rchild,n0,n1,n2);
}
int High(Btree tree)
{
	if(tree==NULL)
		return 0;

	int left=High(tree->lchild)+1;
	int right=High(tree->rchild)+1;
	return left>right?left:right;
}
void free_space(Btree tree)
{
	if(tree==NULL)
		return ;

	free_space(tree->lchild);
	free_space(tree->rchild);
	free(tree);
	tree=NULL;
}
int main(int argc, const char *argv[])
{
	//创建并输入,递归
	Btree tree=create_tree();
	//先序遍历:根左右
	puts("first data is");
	first_output(tree);
	puts("\nmid data is");
	mid_output(tree);
	puts("\nlast data is");
	last_output(tree);

	int n0=0,n1=0,n2=0;
	Count(tree,&n0,&n1,&n2);
	printf("n0=%d  n1=%d  n2=%d\n",n0,n1,n2);

	int h=High(tree);
	printf("高度是:%d\n",h);

	free_space(tree);
	tree=NULL;
	first_output(tree);
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Window下编译ffmpeg

Window下编译ffmpeg 下载MSYS2编译ffmpeg运行 下载MSYS2 MSYS2是一个是工具和库的集合&#xff0c;它能够方便的在windows上编译、安装和运行程序。ffmpeg可以通过这个软件来编译。 从MSYS2官网下载MSYS2并安装。 运行MSYS2终端&#xff0c;在终端中输入命令&#xff0c;安装…

07统计模型练习

使用SPSS进行分析求解 第一题 下表1.1是中国1994-2016年国内旅游总花费Y、国内生产总值X1、铁路里程X2和公路里程X3的数据,请据此分析如下问题: (1)就建立简单线性回归模型,分别分析中国国内旅游总花费与国内生产总值、铁路里程和公路里程数据的数量关系。 (2)对建立的回归模型…

JVS开源基础框架:用户管理介绍(支持同步钉钉、企微、微信等)

在企业内部系统中&#xff0c;用户管理是指对系统内的用户进行管理、授权和权限管理的过程&#xff0c;这里主要介绍用户的创建与基本信息的管理&#xff0c;权限、登录等详细介绍请参考相关章节。 用户管理界面 点击平台管理-用户管理&#xff0c;界面上展示了组织管理与组织…

potplayer放大画面,画面拖拽。备份

放大画面&#xff1a; 按住alt和鼠标左键&#xff0c;就可以拖动放大后的画面了 窗口化示图 倍数调整 默认只能0.1往上加&#xff0c;但是有的视频0.08倍数才正好&#xff0c;需要精确到2位小数。

基于Vue+Element Plus实现表格组件

目录 前言分析实现例子效果图前言 表格对于管理类项目是很重要的,可以只管的展示和比比较数据。使用Element Plus能解决一部分问题,但是还存在一些缺点和不足。 分析 浏览器上表格数据展示空间不足。列显示太多不够直观。完全依赖官方表格组件代码过于臃肿不利于管理和优化…

【Docker】Docker基本管理命令

目录 一、Docker概述1.1容器化受欢迎的原因1.2Docker核心概念 二、安装 Docker2.1环境准备 三、Doker镜像操作镜像操作选项 四 、Docker 容器操作容器操作选项 一、Docker概述 Docker是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵循了apache2.0协议开源。 Docker是…

vue项目之《 搭建路由系统 》

author&#xff1a;德玛玩前端 date&#xff1a;2023-07-22 今天&#xff0c;在工作中拿到了架构师的前端框架&#xff0c;是一个vue2elementui搭建的单页面架构&#xff0c;没有路由系统&#xff0c;需要自己搭建&#xff0c;因为以往拿到的框架都是路由系统已经搭建好&#x…

【Linux】Tcp服务器的三种与客户端通信方法及守护进程化

全是干货~ 文章目录 前言一、多进程版二、多线程版三、线程池版四、Tcp服务器日志的改进五、将Tcp服务器守护进程化总结 前言 在上一篇文章中&#xff0c;我们实现了Tcp服务器&#xff0c;但是为了演示多进程和多线程的效果&#xff0c;我们将服务器与客户通通信写成了一下死循…

iphone新机官网验机流程

苹果官网验机流程 进入苹果官网&#xff0c;找到技术支持&#xff0c;进入“查看保障服务和支持期限“页面&#xff0c;输入要查询的机器的序列号&#xff0c;就可以查询了。 苹果官网验机入口&#xff1a;https://checkcoverage.apple.com/ 输入iphone序列号进行验机&#xff…

【高阶数据结构】B树

文章目录 一、B-树1. 常见的搜索结构2. B树概念3. B-树的查找4. B-树的插入分析 二、B树和B*树1. B树2. B*树 三、B-树的应用1. 索引2. MySQL索引简介2.1 MyISAM2.2 InnoDB 一、B-树 1. 常见的搜索结构 种类数据格式时间复杂度顺序查找无要求O(N)二分查找有序O(log2N)二叉搜索…

【LeetCode热题100】打卡第42天:滑动窗口最大值搜索二维矩阵II

文章目录 【LeetCode热题100】打卡第42天&#xff1a;滑动窗口最大值&搜索二维矩阵II⛅前言 滑动窗口最大值&#x1f512;题目&#x1f511;题解 搜索二维矩阵II&#x1f512;题目&#x1f511;题解 【LeetCode热题100】打卡第42天&#xff1a;滑动窗口最大值&搜索二维…

帖子列表和SerializerMixin注意事项

帖子序列化 继承SerializerMixin 即可调用to_dict()序列化 后端 class PostModel(db.Model, SerializerMixin):serialize_only ("id", "title", "content", "create_time", "board", "author")__tablename__ …

rabbitmq访问异常

看到这个问题&#xff0c;第一时间想到rabbitmq的问题&#xff0c;应该权限导致的 先创建virtual hosts 接着创建用户并赋予权限,将eayc的virtual hosts权限赋予acc用户即可 15:34:24.250 WARN com.rabbitmq.client.impl.ForgivingExceptionHandler - An unexpected connec…

线程的基本概念

线程的基本概念 1. 概念1.1 什么是线程1.2 为什么要有线程1.3 进程和线程的区别 2. 线程创建的基本方法3. Thread 类3.1. Thread 的常见构造方法3.2 Thread 类常见的几种方法 4. 线程的状态 1. 概念 1.1 什么是线程 一个线程就是一个 “执行流”. 每个线程之间都可以按照顺讯…

Vue中TodoList案例_添加

与上一篇Vue中TodoList案例_初始化列表有四个文件变化了 安装nanoid库&#xff1a; npm i nanoid App.vue <template><div id"root"><div class"todo-container"><div class"todo-wrap"><MyHeader :addTodo"…

IDEA快速创建SpringBoot

文件具有错误的版本 61.0, 应为 52.0报错可以看看是不是Springboot的版本比较高 和jdk版本不匹配 package com.qf.controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframewor…

【Java】 服务器cpu过高如何排查和解决?

文章目录 前言一、常见能够引起CPU100%异常的情况都有哪些&#xff1f;二、服务器CPU使用率飙升异常&#xff0c;黄金4步排查法三、排查 CPU 故障的常用命令四、什么场景会造成 CPU 低而负载确很高呢&#xff1f;五、监控发现线上机器内存占用率居高不下&#xff0c;如何分析进…

第一天基础名词

文章目录 一、域名1、域名的概念2、域名注册3、域名的分类 二、DNS1、DNS的概念2、DNS解析3、本地hosts文件与DNS的关系4、如何查看本地Hosts文件 三、CDN1、CDN的概念2、CDN原理&#xff08;1&#xff09;回顾域名解析&#xff08;2&#xff09;CDN原理 3、常见DNS攻击 四、脚…

HideSeeker论文阅读

文章目录 3.1 Overview of Our System HideSeeker3.2 Visual Information Extraction3.3 Relation Graph Learning3.4 Hidden Object Inference 4 EVALUATIONS4.7 Summary 6 DISCUSSIONS AND CONCLUSION 3.1 Overview of Our System HideSeeker 我们设计了一种名为“HideSeeke…

【ARM Cache 系列文章 2 -- Cache Coherence及内存顺序模学习】

文章目录 Cache Coherence 背景1.1 内存顺序模型简介(Memory Model)1.1.1 Normal Memory1.1.2 Device Memory 1.2 Cache 一致性问题解决方案1.2.1 Shareability 属性1.2.2 Non-Shareable 属性1.2.3 Inner-Shareable 属性1.2.4 Out-Shareable 属性 1.3 Shareability 和 PoC/PoU …