【数据结构】特殊的二叉树及其两种存储结构

简介: 一、二叉树的定义​ 了解到树结构之后,介绍一下二叉树,首先我们来做个游戏,我在纸上巳经写好了一个l00以内的正整数数字,请大家想办法猜出我写的是哪一个?注意你们猜数字不能超过7次,我的回答只会告诉你你给的答案 是“大了”还是“小了”。这个游戏在—些电视节目中,猜测-些商品的定价时常会使用。我看到过有些人是一点一带你地数字累加的,比如5、l0、l5、20这样猜,这样的猜数策略太低级了,显然是没有学过数据结构和算法的人才做得出的事。​ 这是一种很经典的折半查找算法,如果我们用折半的办法就一定可以在七次之内猜出结果。

一、二叉树的定义

了解到树结构之后,介绍一下二叉树,首先我们来做个游戏,我在纸上巳经写好了一个l00以内的正整数数字,请大家想办法猜出我写的是哪一个?注意你们猜数字不能超过7次,我的回答只会告诉你你给的答案 是“大了”还是“小了”。这个游戏在—些电视节目中,猜测-些商品的定价时常会使用。我看到过有些人是一点一带你地数字累加的,比如5、l0、l5、20这样猜,这样的猜数策略太低级了,显然是没有学过数据结构和算法的人才做得出的事。

这是一种很经典的折半查找算法,如果我们用折半的办法就一定可以在七次之内猜出结果。

df165d42e5a44488a74ebb4ffe1ae17a.png

二叉树是n(n>0)个节点的有限集合,该集合可能为空,或者有一个根节点和两颗互不相交的、分别成为根节点的左子树和又子树的二叉树组成。


55eed2536931427cb1b716ea0977d708.png

由上图可以看出:

  • 二叉树每个结点最多由两个字数,二叉树不存在度大于2的结点
  • 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序的。
  • 任意的二叉树都是由以下几种情况复合而成的


a299ef2c3aa24c82b4ac5d98eba630e8.png

二、特殊的二叉树

**斜树:**所有结点都向左斜就叫左斜树,所有结点向右斜就叫右斜树。两者都称为斜的树。

**满二叉树:**一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是2^k-1 ,则它就是满二叉树

**完全二叉树:**对一颗具有n个结点的二叉树按层序编号,如果编号为i(1≤i≤n)的结点与同样 深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则这棵二叉树称为完全二叉树。

529797a7a9684604b48a02d996305e97.png

这里有一张非常有意思的图片,堪称现实版的标准二叉树。

e0368132d0954a04be95a8dc884e4bb6.png

三、二叉树的存储结构

二叉树可以使用顺序结构也可以使用链式结构。

1.顺序结构存储

顺序结构通常只适用于完全二叉树,因为不是完全二叉树会有空间的浪费,现实中只有堆才用数组来存储,二叉树顺序存储在物理上是一个数组,在逻辑上是一个二叉树。


450bdae6f10149c6bbe96ed869a80c81.png

2.链式结构存储

二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是 链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。链式结构又分为二叉链和三叉链,当前只涉及到二叉链,后面其他的树结构会用到三叉链(红黑树等)。

typedef int BTDataType;
// 二叉链
struct BinaryTreeNode
{
struct BinTreeNode* _pLeft; // 指向当前节点左孩子
 struct BinTreeNode* _pRight; // 指向当前节点右孩子
 BTDataType _data; // 当前节点值域
}
// 三叉链
struct BinaryTreeNode
{
 struct BinTreeNode* _pParent; // 指向当前节点的双亲
 struct BinTreeNode* _pLeft; // 指向当前节点左孩子
 struct BinTreeNode* _pRight; // 指向当前节点右孩子
 BTDataType _data;        // 当前节点值域
};

d7d3c9764adc43d09c554697b8c3b851.gif

✨本文收录于数据结构理解与实现

下期带来二叉树的理解与实现。如果文章对你有帮助记得点赞收藏关注。













相关文章
|
21天前
|
存储 机器学习/深度学习
【数据结构】二叉树全攻略,从实现到应用详解
本文介绍了树形结构及其重要类型——二叉树。树由若干节点组成,具有层次关系。二叉树每个节点最多有两个子树,分为左子树和右子树。文中详细描述了二叉树的不同类型,如完全二叉树、满二叉树、平衡二叉树及搜索二叉树,并阐述了二叉树的基本性质与存储方式。此外,还介绍了二叉树的实现方法,包括节点定义、遍历方式(前序、中序、后序、层序遍历),并提供了多个示例代码,帮助理解二叉树的基本操作。
40 13
【数据结构】二叉树全攻略,从实现到应用详解
|
16天前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
|
18天前
|
存储 算法 C语言
数据结构基础详解(C语言): 二叉树的遍历_线索二叉树_树的存储结构_树与森林详解
本文从二叉树遍历入手,详细介绍了先序、中序和后序遍历方法,并探讨了如何构建二叉树及线索二叉树的概念。接着,文章讲解了树和森林的存储结构,特别是如何将树与森林转换为二叉树形式,以便利用二叉树的遍历方法。最后,讨论了树和森林的遍历算法,包括先根、后根和层次遍历。通过这些内容,读者可以全面了解二叉树及其相关概念。
|
18天前
|
存储 机器学习/深度学习 C语言
数据结构基础详解(C语言): 树与二叉树的基本类型与存储结构详解
本文介绍了树和二叉树的基本概念及性质。树是由节点组成的层次结构,其中节点的度为其分支数量,树的度为树中最大节点度数。二叉树是一种特殊的树,其节点最多有两个子节点,具有多种性质,如叶子节点数与度为2的节点数之间的关系。此外,还介绍了二叉树的不同形态,包括满二叉树、完全二叉树、二叉排序树和平衡二叉树,并探讨了二叉树的顺序存储和链式存储结构。
|
18天前
|
存储 C语言
数据结构基础详解(C语言): 树与二叉树的应用_哈夫曼树与哈夫曼曼编码_并查集_二叉排序树_平衡二叉树
本文详细介绍了树与二叉树的应用,涵盖哈夫曼树与哈夫曼编码、并查集以及二叉排序树等内容。首先讲解了哈夫曼树的构造方法及其在数据压缩中的应用;接着介绍了并查集的基本概念、存储结构及优化方法;随后探讨了二叉排序树的定义、查找、插入和删除操作;最后阐述了平衡二叉树的概念及其在保证树平衡状态下的插入和删除操作。通过本文,读者可以全面了解树与二叉树在实际问题中的应用技巧和优化策略。
|
18天前
|
存储 算法 C语言
C语言手撕数据结构代码_顺序表_静态存储_动态存储
本文介绍了基于静态和动态存储的顺序表操作实现,涵盖创建、删除、插入、合并、求交集与差集、逆置及循环移动等常见操作。通过详细的C语言代码示例,展示了如何高效地处理顺序表数据结构的各种问题。
|
1月前
|
算法
【初阶数据结构篇】二叉树算法题
二叉树是否对称,即左右子树是否对称.
|
1天前
|
存储
|
18天前
|
存储 C语言
数据结构基础详解(C语言): 栈与队列的详解附完整代码
栈是一种仅允许在一端进行插入和删除操作的线性表,常用于解决括号匹配、函数调用等问题。栈分为顺序栈和链栈,顺序栈使用数组存储,链栈基于单链表实现。栈的主要操作包括初始化、销毁、入栈、出栈等。栈的应用广泛,如表达式求值、递归等场景。栈的顺序存储结构由数组和栈顶指针构成,链栈则基于单链表的头插法实现。
117 3
|
19天前
|
Java
【数据结构】栈和队列的深度探索,从实现到应用详解
本文介绍了栈和队列这两种数据结构。栈是一种后进先出(LIFO)的数据结构,元素只能从栈顶进行插入和删除。栈的基本操作包括压栈、出栈、获取栈顶元素、判断是否为空及获取栈的大小。栈可以通过数组或链表实现,并可用于将递归转化为循环。队列则是一种先进先出(FIFO)的数据结构,元素只能从队尾插入,从队首移除。队列的基本操作包括入队、出队、获取队首元素、判断是否为空及获取队列大小。队列可通过双向链表或数组实现。此外,双端队列(Deque)支持两端插入和删除元素,提供了更丰富的操作。
23 0
【数据结构】栈和队列的深度探索,从实现到应用详解