树中元素的度是指其孩子的个数,树的度是指其元素度的最大值,树的级应该是指树的层数,树根的级为1。
二叉树中每个元素的度均小于等于二即可,并没有其他额外的限制。
若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的节点都连续集中在最左边,这就是完全二叉树。 完全二叉树通俗一点说就是上面一行不满不能往下面添加元素的树,好处是可以用编号找到指定位置的元素,堆是一棵完全二叉树。
满二叉树一棵深度为h且有 2h-1个结点的二叉树。
关于树的遍历那些前序中序后序中的前中后指的是当前节点的值,逐层遍历则采用队列来实现。
得到树的高度:
int getHeight(BinaryTreeNode t)
{
if(!t)return 0;//t是指传入的数结点
int lHeight=getHeight(t->leftChild);
int rHeight=getHeight(t->rightChild);
return (lHeigt>rHeight?lHeight:rHeight)++;
}
最大堆是指所有节点的值都大于或等于其子节点的值的完全二叉树。
向堆中插入元素:
//向堆中插入元素
void Insert(int x)
{
int i=++Size;//size为堆当前的大小
while(i!=1&&x>heap[i/2])
{
heap[i]=heap[i/2];
i=i/2;
}
heap[i]=x;
}
//删除:删除根节点,然后抽出最后一个节点,
//从根位置开始往下找合适的位置插入
int HeapDelete(int h[])
{
int x = h[1]; //最大元素,即根
//-------------重构堆---------------
int y = h[CurrSize--]; //最后一个元素
int i=1/*当前节点*/,pi=2/*i的孩子*/;
while(pi <= CurrSize)
{
if(pi < CurrSize && h[pi] < h[pi+1])
pi++; //若存在右孩子且右孩子较大,则pi指向右孩子
//此时pi已指向i的孩子中较大者
if(y >= h[pi]) break; //y可插入h[i]
h[i] = h[pi]; //不可插入则上移较大孩子
i = pi; pi = pi*2; //继续往下做比较
}
h[i] = y; //插入
return x; //返回删除的元素
}
/*--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --
初始化:从最后一个有孩子的节点开始一直到根,对每一个有孩子的节点,
都在以其为根的子树中寻找合适的位置插入,过程类似于删除
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --*/
void HeapInit(int h[],int cs,int ms)
{
int i,y,pi;
CurrSize = cs; MaxSize = ms;
for(i = CurrSize/2; i >= 1; i--)
{
y = h[i]; //子树的根
pi = 2*i; //其左孩子
while(pi <= CurrSize) //一直往下寻找合适的位置
{
if(pi < CurrSize && h[pi] < h[pi+1])
pi++; //若存在右孩子且右孩子较大,则pi指向右孩子
//此时pi已指向i的孩子中较大者
if(y >= h[pi]) break; //y可插入h[i]
h[pi/2] = h[pi]; //不可插入则上移较大孩子
pi = pi*2; //继续往下做比较
}
h[pi/2] = y; //插入
}
}
左高树和哈夫曼树之类的先不写了。
分享到:
相关推荐
- 数据结构:回溯法常用堆栈,分支限界法常用队列或优先队列。 - 结点特性:回溯法中的活结点在所有可行子结点被遍历后才移除,而分支限界法中每个结点只被处理一次。 - 应用场景:回溯法适合找所有解,分支限界...
- 数据结构:回溯法常用堆栈存储活节点,而分支限界法可能使用优先队列来更有效地选择最优节点。 - 结点存储特性:回溯法的活节点在所有可行子节点被遍历后才会被弹出,而分支限界法则是一次性生成并处理所有子节点...
* 存储结点的常用数据结构:回溯法通常使用堆栈,而分支限界法使用队列或优先队列。 * 结点存储特性:回溯法中,每个结点可以多次成为活结点,而分支限界法中,每个结点只有一次机会成为活结点。 * 常用应用:回溯法...
在编程领域,C语言因其高效、灵活和底层特性而被广泛应用。数据结构是计算机科学中的核心概念,它涉及如何组织和管理数据以提高...通过深入学习“C语言常用数据结构全注解”,你将能够熟练地运用这些工具解决各种问题。
五、特殊数据结构 1. 哈希表:哈希表通过哈希函数将键映射到特定位置,实现快速查找。冲突解决方法包括开放寻址法和链地址法。 2. 字符串:字符串是特殊的字符数组,C语言中常用字符串处理函数如strcpy、strcat、...
### 数据结构教程知识点详解 #### 一、基础知识概述 **数据**:指能够被计算机识别、存储和加工处理的信息载体。 - **数据元素**:数据的基本单位,有时一个数据元素可由若干个数据项组成。例如,整数集合中的...
以下是《数据结构教程》中可能涉及的一些关键知识点: 1. 线性结构:包括数组、链表、栈和队列。数组是最基础的数据结构,提供随机访问;链表则允许动态插入和删除;栈是一种后进先出(LIFO)的数据结构,常用在...
第四章 树主要介绍了树这一数据结构的基本概念、二叉树、线索二叉树、树与森林以及哈夫曼树及其应用。以下是这些知识点的详细解释: **4.1 树的基本概念** 树是一种非线性的数据结构,由n(n>=1)个有限节点组成,...
### 专升本历年数据结构真题解析 #### 一、知识点概述 本文档提供了2009年普通高等教育专升本考试中的计算机科学与技术专业综合二试卷的一部分内容,重点在于数据结构部分的真题及其解答。这些题目涵盖了数据结构...
首先,树是一种非线性的数据结构,由n个数据元素(n>0)组成,其中一个特定的元素称为根节点,其他节点通过层次关系与根节点相连。树的每个节点除了根节点外,只有一个父节点,但可以有多个子节点。没有子节点的节点...
贪心算法是五大常用算法之一,属于算法数据结构的范畴。贪心算法的定义是,在对问题求解时,总是做出在当前看来是最好的选择,也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对...
本教程聚焦于《数据结构教程》的第五版,该版本通常包括理论讲解和实践操作两部分。描述中提到,主教材中可能并未包含所有的上机实验代码,而这些实践环节对于深入理解和应用数据结构至关重要。因此,此压缩包提供的...
#### 五、常用数据结构介绍 1. **线性表**: - 特征:有序的有限序列。 - 基本操作:初始化、求长度、取元素、求前驱/后继、定位、插入、删除。 - 存储方式:顺序存储和链式存储。 通过深入学习数据结构的相关...
15. **第十五章**:介绍AVL树、红黑树和跳跃表等高级数据结构。这些数据结构在无法使用简单的二叉查找树时非常有用。 16. **第十六章**:讨论图及其算法。图是一种表示节点间关系的强大数据结构,特别适用于网络和...
李春葆教授的《数据结构教程》第五版是该领域的经典教材,配套的课件PPT提供了丰富的教学资源,帮助学生深入理解和掌握数据结构的基本概念、算法和应用。 一、数据结构基本概念 数据结构是指数据的存储结构,包括...
通过以上内容可以看出,《C++数据结构与算法(第4版)》这本书旨在全面介绍数据结构的基本概念、常用的数据结构类型、典型排序和查找算法,以及算法设计与分析的方法和技术。这些知识点对于学习计算机科学和编程语言...
其中,**表**和**树**是最常用的数据结构,可以用于设计实现许多高效的算法。 #### 四、物理结构详解 物理结构主要关注数据如何在计算机内存中存储,常见的物理结构包括: 1. **顺序存储**:将数据元素连续存储在...
2. **栈与队列**:栈是一种后进先出(LIFO)的数据结构,常用在表达式求解、函数调用等方面;队列则是先进先出(FIFO)的数据结构,常用于任务调度、打印机队列等场景。 3. **树形结构**:树是一种非线性的数据结构...
5. 最小生成树:给定一个图,需要找到最小生成树,使得所有点都连接起来。 6. 多机调度问题:给定一个机器列表和每个机器的处理能力,需要安排这些机器,使得总处理时间最小。 贪心算法是一种常用的算法设计技术,...
- **树**:层次关系的数据结构。 - **二叉树**:每个节点最多有两个子节点的树。 - **二叉查找树(BST)**:左子树的所有节点值小于根节点值,右子树的所有节点值大于根节点值的二叉树。 - **平衡二叉树**:左右...