一、二叉树的定义
了解到树结构之后,介绍一下二叉树,首先我们来做个游戏,我在纸上巳经写好了一个l00以内的正整数数字,请大家想办法猜出我写的是哪一个?注意你们猜数字不能超过7次,我的回答只会告诉你你给的答案 是“大了”还是“小了”。这个游戏在—些电视节目中,猜测-些商品的定价时常会使用。我看到过有些人是一点一带你地数字累加的,比如5、l0、l5、20这样猜,这样的猜数策略太低级了,显然是没有学过数据结构和算法的人才做得出的事。
这是一种很经典的折半查找算法
,如果我们用折半的办法就一定可以在七次之内猜出结果。
二叉树是n(n>0)个节点的有限集合,该集合可能为空,或者有一个根节点和两颗互不相交的、分别成为根节点的左子树和又子树的二叉树组成。
由上图可以看出:
- 二叉树每个结点最多由两个字数,二叉树不存在度大于2的结点
- 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序的。
- 任意的二叉树都是由以下几种情况复合而成的
二、特殊的二叉树
**斜树:**所有结点都向左斜就叫左斜树,所有结点向右斜就叫右斜树。两者都称为斜的树。
**满二叉树:**一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是2^k-1 ,则它就是满二叉树
**完全二叉树:**对一颗具有n个结点的二叉树按层序编号,如果编号为i(1≤i≤n)的结点与同样 深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则这棵二叉树称为完全二叉树。
这里有一张非常有意思的图片,堪称现实版的标准二叉树。
三、二叉树的存储结构
二叉树可以使用顺序结构也可以使用链式结构。
1.顺序结构存储
顺序结构通常只适用于完全二叉树
,因为不是完全二叉树会有空间的浪费,现实中只有堆才用数组来存储,二叉树顺序存储在物理上是一个数组,在逻辑上是一个二叉树。
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; // 当前节点值域 };
✨本文收录于数据结构理解与实现
下期带来二叉树的理解与实现。如果文章对你有帮助记得点赞收藏关注。