开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情
二叉树及存储结构
3.2.1 二叉树的定义及性质
二叉树的定义
二叉树T:一个有穷的结点集合
• 这个集合可以为空
若不为空,则它是由根结点和称为其左子树TL和右子树TR的两个不相交的二叉树组成(L和R是下标)
二叉树具体五种基本形态
二叉树的子树有左右之分
特殊的二叉树
斜二叉树(Skewed Binary Tree)
- 只有左边或者只有右边,相当于一个链表
完美二叉树(Perfect Binary Tree)
或者叫做满二叉树(Full Binary Tree)
特点: 一个深度为k(>=-1)且有2^(k+1) - 1个结点的二叉树称为完美二叉树。 满二叉树
完全二叉树(Complete Binary Tree)
有n个结点的二叉树,对树种结点按从上到下,从左到右的顺序进行编号,编号为i(1 <= i <= n)结点与满二叉树中编号为i结点在二叉树中位置相同
跟上方的区别就是除了最底下一层可以右边缺一点,上面跟满二叉树是一样的。最底下一层左边顺序不能乱
二叉树的几个重要性质
叶结点的总数等于有两个儿子的结点的总数加1
有一颗二叉树,其两个儿子的结点个数为15个,一个儿子的结点个数为32个,问该二叉树的叶结点个数是多少?
16
二叉树的抽象数据类型定义
类型名称:二叉树
数据对象集:一个有穷的结点集合。
若不为空,则由根结点和其左、右二叉子树组成。
操作集: BT属于BinTree,Item属于ElementType
重要操作有:
1.Boolean IsEmpty(BinTree BT):判别BT是否为空;
2.void Traversal(BinTree BT):遍历,按某顺序访问每个结点;(重要)
3.BinTree CreateBinTree():创建一个二叉树
常用的遍历方法
1.void PreOrderTraversal(BinTree BT)://先序--根、左子树、右子树
2.void InOrderTraversal(BinTree BT)://中序--左子树、根、右子树
3.void PostOrderTraversal(BinTree BT)://后序--左子树、右子树、根
4.void LevelOrderTraversal(BinTree BT)://层次遍历(层序遍历,从上到下、从左到右
3.2.2 二叉树的存储结构
1.顺序存储结构
完全二叉树:按从上至下,从左到右顺序存储n个结点的完全二叉树的结点父子关系;
//这个树最适合数组方式解决
-
非根结点(序号 i > 1)的父节点的序号是[i/2]
- 这句话的意思就是说假设我们目前知道M结点时6,如果想知道它的父节点就是6/2=3,Q结点就是7/2=3.5,把小数去掉,父节点一样是3
-
结点(序号为i)的左孩子结点的序号是2i,(若2i <= n,否则没有左孩子)
- 举例:意思就是B左孩子是C,O的左孩子是M
-
结点(序号为i)的右孩子结点的序号是2i+1,(若2i+1 <= n,否则没有右孩子)
- 举例:类似上方的意思B右孩子是S...
一般二叉树也可以采用这种结构,缺点:但会造成空间浪费....(将缺少的结点补上一个空结点)
问题:
如果参照完全二叉树的表示方法用数组存储下面这棵二叉树,那么结点e所对应的数组下标是多少(树根下标为1)?
答案:6
2.链表存储
typedef struct TreeNode *BinTree;
typedef BinTree Position;
struct TreeNode{
ElementType Data;
BinTree Left;
BinTree Right;
}