首页 > 其他分享 >数据结构---树

数据结构---树

时间:2023-09-26 18:35:19浏览次数:28  
标签:node 结点 NULL 存储 --- 二叉树 编号 数据结构

数据结构---树

二叉树

特征

  1. 二叉树每个结点最多有2个子结点
  2. 二叉树的子树有左右之分

引理

  1. 二叉树中层数为 i 的结点至多有2^i个,i≥0

  2. 高度为k (k >=0)的二叉树中至少有k+1个结点。含有k (k >=1)个结点的二叉树高度至多为k-1

  3. 高度为k的二叉树中至多有2^(k+1)-1 (k>=0) 个结点

  4. 设T是由n个结点构成的二叉树,其中,叶结点个数为n_0,度为2的结点个数为n_2,则n_0和n_2 的关系是: n_0 = n_2 + 1

满二叉树

一棵非空高度为k( k >= 0)的满二叉树,是有2^(k+1) – 1个结点的二叉树

完全二叉树

定义:

一棵有 n 个结点、高为 k 的二叉树 T,一棵高为 k 的满二叉树 T^,用正整数按层次顺序分别编号 T 和 T^ 的所有结点,如果T 之所有结点恰好对应于T^的前 n 个结点,则称 T 为完全二叉树。

层次顺序:按从上至下,即从第 0 至第 k 层,每层由左到右的次序。

特点:
  1. 树中只有最下面两层结点的度可以小于2

  2. 树中最下面一层的结点都集中在该层最左边的若干位置上(满二叉树意义上)

  3. 树中叶结点只能在层数最大的两层上出现,即存在一个非负整数k使得树中每个叶结点或在第k层或第k + 1层上

  4. 对树中所有结点,按层次顺序,用自然数从1开始编号,仅仅编号最大的非叶结点可以没有右孩子,其余非叶结点都有两个孩子结点

引理:

①设若将一棵具有n个结点的完全二叉树按层次次序从1开始编号,则对编号为i (1 <= i <= n)的结点有:

  1. 若i≠1,则编号为 i 的结点的父结点的编号为 (i/2)下限.

  2. 若2i <= n,则编号为 i 的结点的左孩子的编号为 2i, 否则 i 无左孩子

  3. 若2i+1 <= n,则 i 结点的右孩子结点编号为2i+1,否则 i 无右孩子

②具有n个结点的完全二叉树的高度是(log2n)下限

注意: 仅仅编号最大的非叶结点可无右孩子, 但必须有左孩子, 其余非叶结点都有两个孩子结点

二叉树的存储形式:

顺序存储
  1. 一维数组A存储二叉树, A[1]存储二叉树的根结点,A[i]存储二叉树中编号为i的结点,并且结点A[i]的左孩子(若存在)存放在A[2i]处,而A[i]的右孩子(若存在)存放在A[2i+1]处。
  2. 优点: 简单、节省空间
    只存储结点信息域、未存储其左孩子和右孩子。通过计算可找到它的左孩子、右孩子和父 结点,寻找子孙结点和祖先结点也非常方便
  3. 缺点: 编号不能与结点一一对应
    解决方案:先加入若干虚结点将其转换成一棵“完全二叉树”,然后再对原来的结点和虚结点统一编号,最后完成顺序存储。但这 增加了用于存储虚结点的空间。
链式存储

image-20230926171653031

image-20230926171726260

二叉树的遍历:

image-20230926171902580

#include<iostream>
using namespace std;

typedef struct node
{
	struct node* left;
	char data;
	struct node* right;
}node;

//根据先跟序列创建二叉树, NULL用'#'表示
void CBT(node* &T)
{
	char ch;
	ch = getchar();
	if(ch == '#')
	{
		T = NULL;
	}
	else
	{
		T = new node;
		T->data = ch;
		CBT(T->left);
		CBT(T->right);
	}
}

//先根遍历
void  Preorder(node* p)
{
	if(p != NULL)	
	{
		cout<<p->data;
		Preorder(p->left);
		Preorder(p->right);
	}
}

//中根遍历
void  Inorder(node* p)
{
	if(p != NULL)	
	{
		Inorder(p->left);
		cout<<p->data;
		Inorder(p->right);
	}
}

//后根遍历
void  Postorder(node* p)
{
	if(p != NULL)	
	{
		Postorder(p->left);
		Postorder(p->right);
		cout<<p->data;
	}
}

int main(){
	
	node* T = NULL;
	cout<<"输入:"<<endl;
	
	CBT(T);
	
	Preorder(T);
	cout<<endl;
	
	Inorder(T);
	cout<<endl;
	
	Postorder(T);
	
	return 0;
}

标签:node,结点,NULL,存储,---,二叉树,编号,数据结构
From: https://www.cnblogs.com/Dorcnf/p/17730890.html

相关文章

  • 无涯教程-JavaScript - STDEVA函数
    描述STDEVA函数根据样本估算标准偏差。标准偏差是对值与平均值(平均值)的分散程度的度量。语法STDEVA(value1,[value2]...)争论Argument描述Required/OptionalValue11至255个值,对应于总体样本。您也可以使用单个数组或对数组的引用,而不要使用以逗号分隔的参数......
  • 文心一言 VS 讯飞星火 VS chatgpt (101)-- 算法导论9.3 7题
    七、用go语言,设计一个O(n)时间的算法,对于一个给定的包含n个互异元素的集合S和一个正整数k≤n,该算法能够确定S中最接近中位数的k个元素。文心一言:要设计一个O(n)时间的算法来找到集合S中最接近中位数的k个元素,我们可以使用快速选择算法(QuickSelect)。该算法基于快速排......
  • 文心一言 VS 讯飞星火 VS chatgpt (101)-- 算法导论9.3 7题
    七、用go语言,设计一个O(n)时间的算法,对于一个给定的包含n个互异元素的集合S和一个正整数k≤n,该算法能够确定S中最接近中位数的k个元素。文心一言:要设计一个O(n)时间的算法来找到集合S中最接近中位数的k个元素,我们可以使用快速选择算法(QuickSelect)。该算法基于快速排序的......
  • 记录--前端实现并发请求限制
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助前言前两天我的新同事告诉我一个困扰着他的问题,就是低代码平台中存在很多模块,这些模块的渲染是由模块自身处理的,简言之就是组件请求了自己的数据,一个两个模块还好,要是一次请求了几十个模块,就会出现请求阻塞的问题......
  • C#6-c#7 知识点使用汇总
    七、C#6.0语法及使用6.0.01usingstatic静态导入指令命名了一种类型,无需指定类型名称即可访问其静态成员和嵌套类型.demo:usingstaticSystem.Console;WriteLine("dennychen");//System.Console.WriteLine("dennychen");6.0.02trycatchwhen异常筛选器:仅在满足某些......
  • P7913 [CSP-S 2021] 廊桥分配
    暴力枚举枚举国内和国外的廊桥数量配额,再模拟航班停机过程#include<cstdio>#include<algorithm>usingnamespacestd;constintN=100005;structFlight{intl,r;//l抵达时刻,r离开时刻booloperator<(constFlight&other)const{returnl<......
  • C语言双指针法解决-有序数组的平方
     力扣(LeetCode)官网-全球极客挚爱的技术成长平台/***Note:Thereturnedarraymustbemalloced,assumecallercallsfree().*/intcmp(constvoid*a,constvoid*b){return(*(int*)a)-(*(int*)b);}int*sortedSquares(int*nums,intnumsSize,......
  • 2-docker之daemon
    参考文档https://docs.docker.com/config/daemon/1.docker.20docker版本20以后graph修改成data-root{"api-cors-header":"",在引擎API中设置CORS标头"authorization-plugins":[],要加载的授权插件"bridge":"",将容器附加到网桥"cgrou......
  • 取模算术运算符-应用3-分解一个整数
    C语言中分解一个整数需要使用到整除和取余运算符。两个整数相除只会保留整数,一个数对另外一个数取余,会得到余数。示例代码如下: #include<stdio.h>voidmain(){ intnum=521; intbai,shi,ge; //整除100,只会保留整数部分的百位 bai=num/100; ......
  • CH643-RGB内驱键盘方案软件使用技巧(持续更新)
    一、如何改变键盘使用COM数量CH643内驱键盘方案demo默认使用3*8(RGBSEG)+13COM的结构,也就是最多能够驱动13*8=104个RGB灯,如果想要增加或者减少COM使用数量需要怎么处理呢?具体操作步骤如下:1、IO初始化修改,修改使用COM引脚IO的初始化,如下图所示:2、修改PWM配置初始化中LEDPWM->COM......