二叉树及存储结构
目录
数据结构与算法_Python_C完整教程目录:https://www.cnblogs.com/nickchen121/p/11407287.html
一、二叉树的定义
二叉树T:一个有穷的结点集合。
- 这个集合可以为空
- 若不为空,则它是由根节点和称为其左子树\(T_L\)和右子树\(T_R\)的两个不相交的二叉树组成。
二叉树具体五种基本形态
二叉树的子树有左右顺序之分
二、特殊二叉树
2.1 斜二叉树(Skewed Binary Tree)
斜二叉树如下图所示:
2.2 完美二叉树(Perfect Binary Tree)
完美二叉树也称作满二叉树(Full Binary Tree)
完美二叉树如下图所示:
2.3 完全二叉树(Complete Binary Tree)
有n个结点的二叉树,对树中结点按从上至下、从左到右顺序进行编号,编号为\(i(1\leq{i}\leq{n})\)结点与满二叉树中编号为i结点在二叉树位置相同。
完全二叉树如下图所示:
如下图所示的二叉树即不为完全二叉树:
三、二叉树的几个重要性质
- 一个二叉树第i层的最大结点树为:\(2^{i-1}, \quad{i}\geq1\)
- 深度为k的二叉树有最大结点总数为:\(2^k -1, \quad k\geq{1}\)
- 对任何非空二叉树T,若\(n_0\)表示叶节点的个数、\(n_2\)是度为2的非叶结点个数,那么两者满足关系\(n_0=n_2+1\)
四、二叉树的抽象数据类型定义
类型名称:二叉树
数据对象集:一个有穷的结点集合。若不为空,则由根节点和其左、右二叉子树组成。
操作集:\(BT\in{BinTree},\quad Item \in ElementType\),其重要操作有:
BooleanIsEmpty(BinTree BT)
:判断BT是否为空;void Traversal(BinTree BT)
:遍历,按某顺序访问每个结点;BinTree CreateBinTree()
:创建一个二叉树。
4.1 常用的遍历方法
接下来介绍几个常用的遍历方法,未来会详细讲解。
void PreOrderTraversal(BinTree BT)
:先序 --》根、左子树、右子树;
void InOrderTraversal(BinTree BT)
:中序 --》左子树、根、右子树;
void PostOrderTraversal(BinTree BT)
:后序 --》左子树、右子树、根;
void LevelOrderTraversal(BinTree BT)
:层次遍历,从上到下、从左到右
五、二叉树的存储结构
5.1 顺序存储结构
完全二叉树:按从上至下、从左到右顺序存储,n个结点的完全二叉树的结点父子关系
- 非根节点(序号i>1)的父结点的序号是\([i/2]\);
- 结点(序号为i)的左孩子结点的序号是2i(若\(2i\leq{n}\),否则没有左孩子);
- 结点(序号为i)的右孩子结点的序号是2i+1(若\(2i+1\leq{n}\),否则没有右孩子)
一般二叉树也可以采用这种结构,但会造成空间浪费……
5.2 链表存储
/* c语言实现 */
typedef struct TreeNode *BinTree;
typedef BinTree Position;
struct TreeNode{
ElementType Data;
BinTree Left;
BinTree Right;
}
# python语言实现
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
单个子节点用下图所示链表表示:
使用链表对整棵树的表示如下: