009——二叉树

news2024/11/24 17:41:03

目录

二叉树的五种基本形态:

1.二叉树可以是空树

2.只有一个根节点的树

3.斜树:只有左子树或右子树的树

4.左右孩子都有的树

二叉树的性质:

1.假设根节点是第一层,在二叉树的第i层上最多有2^(n-1)个结点

2.深度为k的二叉树,最多有(2^k)-1个结点

3.任意一个非空二叉树,度为0的结点数比度为2的结点数多一个

4.在完全二叉树中有无度为1的判断

5.具有N个结点的完全二叉树的深度为log2(N+1)(向下取整)或者(log2N)+1(向上取整)

6. 如果有一棵n个结点的完全二叉树,其结点编号按照层次序(从上到下,从左到右),则除根结点外,满足[i/2 , i, 2i, 2i+1]的规则

二叉树的存储方式

1.直接采用数组存储二叉树,将任意一个二叉树补成完全二叉树,不过这样容易造成空间上的浪费

2.二叉链表存储


二叉树是树中最常用的一种,即度为2的树(每个结点最多有两个孩子),在二叉树中,结点的度只有0、1、2这三种可能

二叉树的五种基本形态:

1.二叉树可以是空树

2.只有一个根节点的树

3.斜树:只有左子树或右子树的树

4.左右孩子都有的树

二叉树的性质:

1.假设根节点是第一层,在二叉树的第i层上最多有2^(n-1)个结点

解释:若想要结点数最多,则要求除叶子结点外,每个结点的度都为2

层数                                        该层结点数

一层:        根节点                        1

二层:        1*2                             2

三层            2*2                             4

四层            4*2                             8

 n层           2*2*...*2                    2^(n-1)

2.深度为k的二叉树,最多有(2^k)-1个结点

将所有层次的结点数相加,再根据等比数列求和公式可得

满二叉树

而有(2^k)-1个结点的树有被称作满二叉树,满二叉树没有度为1的结点

完全二叉树

对满二叉树的结点编号(从上到下再从左到右)从后面删除若干个连续的编号最大的结点,剩下的部分就是完全二叉树

如下图删除15.14.13

同时,对于完全二叉树来说,度为1的结点要么没有,要么只有一个

满二叉树也是完全二叉树

3.任意一个非空二叉树,度为0的结点数比度为2的结点数多一个

解释:

按照度来分,我们可以将其分成度分别为0,1,2的结点:

n = n0 + n1 + n2

按照有无父亲,或者说是是否可以当作孩子结点,我们可以分成根节点和其他结点:

n = 1 + (n-1)

而在这(n-1)个孩子结点里,我们可以再将每个结点看作父亲,

度为0的父亲没有孩子        0 * n0

度为1的父亲一个孩子        1 * n1

度为2的父亲两个孩子        2 * n1

所以可以推出

n = 1 +  0 * n0 +  n1 + 2n1

n0 + n1 + n2  = 1 +   n1 + 2n1

                 n0 = n2 + 1

或者从连线个数的角度理解:

n个结点的树有n-1条连线

度为0的树向下有0条

度为1的树向下有n1条

度为2的树向下有2n2条

n1+n2+n0-1 =n1+2n2 

             n0-1=n2

4.在完全二叉树中有无度为1的判断

没有度为1的结点,n=n0+n2=n2+1+n2=2n2+1

有度为1的结点,n=n0+n1+n2=2n2+2

所以在完全二叉树中,结点数为奇数,没有度为1的结点;结点数为偶数,有度为1的结点且只有1个

5.具有N个结点的完全二叉树的深度为log2(N+1)(向下取整)或者(log2N)+1(向上取整)

6. 如果有一棵n个结点的完全二叉树,其结点编号按照层次序(从上到下,从左到右),则除根结点外,满足[i/2 , i, 2i, 2i+1]的规则

二叉树的存储方式

1.直接采用数组存储二叉树,将任意一个二叉树补成完全二叉树,不过这样容易造成空间上的浪费

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<stdlib.h>
char data[1005];
int flag;//=0 左  =1右孩子 
int find(char fx)
{
	for (int i = 1; i < 1005; i++)
	{
		if (data[i] == fx)
		{
			return i;
		}
	}
}
int main()
{
	int n;
	char root;
	printf("读入数据个数:\n");
	scanf("%d", &n);
	for (int i = 0; i < 1005; i++)
	{
		data[i] = ' ';
	}
	getchar();
	printf("读入根结点:\n");
	scanf("%c", &root);
	data[1] = root;
	char x, fx;//数据为x,fx为x的父亲  
	int fxi, xi;
	for (int i = 1; i <= n - 1; i++)
	{
		getchar();
		printf("读入剩下的结点(x fx flag):\n");
		scanf("%c %c %d", &x, &fx, &flag);
		fxi = find(fx);//寻找父亲结点的下标 
		if (flag == 0)
		{
			xi = 2 * fxi;
		}
		else {
			xi = 2 * fxi + 1;
		}
		data[xi] = x;
	}
	getchar();

	printf("查找某个结点的孩子父亲结点:\n");
	scanf("%c", &x);
	xi = find(x);
	if (xi == 1)
	{
		printf("根节点,无父亲节点\n");
	}
	else {
		printf("父亲结点:%c\n", data[xi / 2]);
	}
	printf("孩子节点是:%c %c\n", data[2 * xi], data[2 * xi + 1]);

	return 0;
}

2.二叉链表存储

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
//二叉链表节点结构
typedef struct BTNode {
	char data;
	struct BTNode* left;//保存左孩子地址
	struct BTNode* right;//保存右孩子地址
	//struct BTNode* fa;//保存父亲的地址 
}BTNode, * BTree;
BTree initBTree(char root)
{
	BTNode* r = (BTNode*)malloc(sizeof(BTNode));
	if (r == NULL)
	{
		printf("空间分配失败\n");
		return NULL;
	}
	r->data = root;
	r->left = r->right = NULL;
	//r->fa=NULL; 
	return r;
}
BTNode* find(BTree r, char fx)
{
	if (r == NULL || r->data == fx)
	{
		return r;
	}

	if (r->left != NULL)
	{
		BTNode* ans = find(r->left, fx);
		if (ans != NULL && ans->data == fx)
		{
			return ans;
		}
	}
	if (r->right != NULL)
	{
		BTNode* ans = find(r->right, fx);
		if (ans != NULL && ans->data == fx)
		{
			return ans;
		}
	}
	return NULL;
}

BTree insert(BTree r, char x, char fx, int flag)
{
	BTNode* f = find(r, fx);
	if (f == NULL)
	{
		printf("父亲节点不存在,不能插入\n");
	}
	else
	{
		BTNode* s = (BTNode*)malloc(sizeof(BTNode));
		//判断s==NULL
		s->data = x;
		s->left = s->right = NULL;
		//s->fa=f;
		if (flag == 0)
		{
			f->left = s;
		}
		else {
			f->right = s;
		}
	}
	return r;
}
int main()
{
	int n;
	int flag;//=0 左  =1右孩子 
	BTree r = NULL;
	char root;
	printf("输入结点的总个数:\n");
	scanf("%d", &n);
	getchar();
	printf("输入根节点:\n");
	scanf("%c", &root);
	r = initBTree(root);
	char x, fx;
	for (int i = 1; i <= n - 1; i++)
	{
		getchar();
		printf("输入结点信息(x, fx, flag):\n");

		scanf("%c %c %d", &x, &fx, &flag);
		r = insert(r, x, fx, flag);
	}

	getchar();
	printf("输入要查找的结点:\n");
	scanf("%c", &x);

	BTNode* p = find(r, x);
	if (p != NULL && p->left != NULL)
	{
		printf("左孩子%c\n", p->left->data);
	}
	if (p != NULL && p->right != NULL)
	{
		printf("右孩子%c\n", p->right->data);
	}


	return 0;
}

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

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

相关文章

【JAVA+flowable】工作流 获取流程节点 几种方法总结

flowable中 获取流程中任务节点的方法有好几种 1.这种是常见的一种 获取流程 正在激活 中任务节点 List<HistoricActivityInstance> historicActivityInstanceList historyService.createHistoricActivityInstanceQuery().processInstanceId(procInsId).activityTyp…

Java面试宝典-Java集合02

目录 Java面试宝典-Java集合02 21、TreeMap 和 TreeSet 在排序时如何比较元素&#xff1f; 22、ArrayList 和 LinkedList 的区别是什么&#xff1f; 23、ArrayList 和 Vector 的区别&#xff1f; 24、队列和栈是什么&#xff1f;有什么区别&#xff1f; 25、Queue和Deque的区别…

FreeRTOS对事件标志组的总结

事件标志组 事件标志组讲可以用一个例子来理解&#xff0c;“拼车”&#xff0c;一辆车上有32个座位&#xff08;一个事件标志组的长度&#xff09;&#xff0c;前8个座位用来存放车辆信息&#xff0c;车上可以坐24个人。我们可以选择当所有人都坐满再发车&#xff0c;也可以选…

常用类(一)----包装类的使用和分析

文章目录 1.包装类2.课堂测试题3.包装类方法4.Integer创建机制5.Integer面试题 1.包装类 概念&#xff1a;基本数据类型对应的类就是包装类&#xff0c;就是为了把基本数据类型转换为包装类&#xff0c;使用这个类里面的方法操作数据----装箱的过程&#xff1b; //装箱&#…

算子级血缘在数据全链路变更感知、影响分析场景下的应用

我们都知道&#xff0c;数据的完整性、可用性和准确性对企业决策至关重要。数据采集、存储、加工到消费的任何一个环节失误都可能对最终的数据质量产生负面影响。而今&#xff0c;数据量激增、数据资产多样化及数据加工链路复杂化&#xff0c;数据全链路变更感知监控和影响面精…

Magnum IO

NVIDIA Magnum IO 文章目录 前言加速数据中心 IO 性能,随时随地助力 AINVIDIA Magnum IO 优化堆栈1. 存储 IO2. 网络 IO3. 网内计算4. IO 管理跨数据中心应用加速 IO1. 数据分析Magnum IO 库和数据分析工具2. 高性能计算Magnum IO 库和 HPC 应用3. 深度学习Magnum IO 库和深度…

AndroidStudio配置MQTT连接云平台EMQX

引言 本篇博客主要介绍mqtt和emqx配置连接实现数据收发&#xff0c;我会从基础的本机连接到手机和本机连接再到手机实现mqtt连接云平台&#xff0c;大家可以根据需要自行选择观看&#xff08;后面两个教程都建立在mqtt和emqx下载完成的基础上&#xff0c;若没有下载完成&#x…

一文介绍SQL标准1986~2023的演变

SQL标准1986年制定第一版&#xff0c;到最新的2023版&#xff0c;已经有38年的历史&#xff0c;现在依然是计算机非常活跃的语言&#xff0c;50%的程序员都能掌握SQL&#xff0c;数据分析师也是SQL的主要使用人员之一。 从早期的基本语法&#xff0c;到融合了XML、JSON等复杂数…

vue-组件通信

组件通信是什么 组件通信就是组件与组件之间的数据传递 组件的数据是独立的&#xff0c;无法直接访问其他组件的数据 组件关系 组件关系的两大类&#xff1a; 组件A和B是非父子关系&#xff0c;组件C对于A和B是父子关系 父子通信 父组件通过props将数据传递给子组件 子组件利…

sed awk 第二版学习(六)—— 编写 awk 脚本

目录 一、awk 程序设计模型 二、模式匹配 三、记录和字段 1. 字段的引用和分离 2. 字段的划分 四、表达式 五、系统变量 1. FS、OFS、RS、ORS 2. NF 3. NR、FILENAME、FNR 4. CONVFMT、OFMT 5. 两个例子 &#xff08;1&#xff09;处理多行记录 &#xff08;2&am…

Alas配置更新器自动更新

之前我的部署方法有些问题&#xff0c;不应该下载源码再上传到服务器&#xff0c;这样会导致无法使用更新器&#xff0c;只能手动更新&#xff0c;比较麻烦&#xff0c;最近改用git方式获取源码&#xff0c;解决了无法使用更新器的问题&#xff0c;亲测有效 以下操作均基于雨云…

探索未知,惊喜连连 —— 盲盒小程序开发文案

在这个充满惊喜与好奇的时代&#xff0c;盲盒已经成为了一种独特的文化现象&#xff0c;它不仅仅是一种商品&#xff0c;更是一种心灵的慰藉和乐趣的源泉。为了满足广大盲盒爱好者的需求&#xff0c;我们精心打造了一款盲盒小程序&#xff0c;让惊喜触手可及&#xff0c;随时随…

数据库——创立表和库

数据库&#xff08;Database&#xff09;是一个用于存储、管理和检索数据的系统。它可以组织结构化数据&#xff0c;支持高效的存取和操作。数据库通常由一个数据库管理系统&#xff08;DBMS&#xff09;来支持&#xff0c;常见的DBMS包括&#xff1a; 关系数据库&#xff08;R…

如何正确的用引用作返回值?

错误一&#xff1a;引用作函数返回值&#xff0c;但函数中没用static修饰 下面代码输出什么结果&#xff1f; 输出结果&#xff1a; Q&#xff1a;ret应该是3&#xff0c;为什么再调用一次Add函数后&#xff0c;ret变成了7&#xff1f; 解释&#xff1a; ①&#xff1a;在第二…

steam上传游戏问题汇总

问题 首先是Library Logo 必须是png图片&#xff0c;还必须带上游戏名字你的宣传图不能使用游戏内部的截图。Library_Hero必须是空白的&#xff0c;不能有任何文字。他是和Library_logo合并在一起的。这个法律其实没必要填写。然后我错误的把EULA填写在这里了也报错了 如果你在…

《Linux从小白到高手》综合应用篇:详解Linux系统调优之服务器硬件优化

List item 本篇介绍Linux服务器硬件调优。硬件调优主要包括CPU、内存、磁盘、网络等关键硬件组。 1. CPU优化 选择适合的CPU&#xff1a; –根据应用需求选择多核、高频的CPU&#xff0c;以满足高并发和计算密集型任务的需求。CPU缓存优化&#xff1a; –确保CPU缓存&#x…

电容补偿功率因数不标准会怎样

电容补偿功率因数如果不符合标准&#xff0c;可能会对电力系统和设备运行造成多种负面影响。以下是功率因数补偿不当可能引发的问题&#xff1a; 1、欠补偿或不足补偿的影响 功率因数偏低&#xff1a;如果补偿量不足&#xff0c;功率因数未达到预期值&#xff08;通常在0.9至…

【C++】C++入门基础

一. 第一个C程序 #include<iostream> using namespace std;int main() {cout << "hello world" << endl;return 0; } 二.命名空间 1.namespace的价值 在C/C中&#xff0c;变量、函数和后⾯要学到的类都是⼤量存在的&#xff0c;这些变量、函数…

数据结构修炼——栈和队列是什么?如何实现?从入门到实战

目录 一、栈1 栈的概念及结构2 栈的实现 二、队列1 队列的概念及结构2 队列的实现 三、栈和队列OJ题1 有效的括号2 用队列实现栈3 用栈实现队列4 循环队列 四、概念选择题 一、栈 1 栈的概念及结构 栈&#xff1a;一种特殊的线性表。栈只允许在固定端进行插入和删除操作。进行…

专业的客服话术快捷回复软件

在当今快节奏的工作环境中&#xff0c;客服行业面临着前所未有的挑战。尤其是对于刚入行的新手小白来说&#xff0c;如何快速提升响应速度、保证回复质量&#xff0c;成为了他们亟待解决的问题。而今天&#xff0c;我要向大家推荐的这款“客服宝”快捷回复软件&#xff0c;就非…