数据结构–二叉树的存储结构
二叉树的顺序存储
#define MaxSize 100
struct TreeNode
{
ElemType value;
bool isEmpty;
};
TreeNode tree[MaxSize];
初始化
void init()
{
for (int i = 0; i < MaxSize; i++)
tree[i].isEmpty = true;
}
几个重要常考的基本操作:
- i的左孩子: 2 i 2i 2i
- i的右孩子: 2 i + 1 2i + 1 2i+1
- i的父节点: ⌊ i / 2 ⌋ \lfloor i/2 \rfloor ⌊i/2⌋
- i所在的层次: ⌈ log 2 ( n + 1 ) ⌉ 或 ⌊ log 2 n ⌋ + 1 \lceil\log_2(n+1)\rceil\text{或}\lfloor\log_2n\rfloor+1 ⌈log2(n+1)⌉或⌊log2n⌋+1
若 完全二叉树 \color{red}完全二叉树 完全二叉树中共有n个结点,则
- 判断i是否有左孩子? 2 i ≤ n ? 2\mathrm{i}\leq\mathrm{n}? 2i≤n?
- 判断i是否有右孩子? 2 i + 1 ≤ n ? 2\mathrm{i}+1\leq\mathrm{n}? 2i+1≤n?
- 判断i是否是叶子/分支结点? i > ⌊ n / 2 ⌋ ? \mathrm{i}>\lfloor n/2\rfloor? i>⌊n/2⌋?
如果不是完全二叉树,依然按层序将各节点顺序存储 , 无法从结点编号反映出结点间的逻辑关系 \color{purple}如果不是完全二叉树,依然按层序将各节点顺序存储,无法从结点编号反映出结点间的逻辑关系 如果不是完全二叉树,依然按层序将各节点顺序存储,无法从结点编号反映出结点间的逻辑关系
二叉树的顺序存储中, 一定要把二叉树的结点编号与完全二叉树对应起来 \color{red}一定要把二叉树的结点编号与完全二叉树对应起来 一定要把二叉树的结点编号与完全二叉树对应起来
最坏情况:
高度为h且只有h个结点的单支树(所有结点只有右孩子),也至少需要
2
h
−
1
2^h-1
2h−1 个存储单元
结论:
二叉树的顺序存储结构,只适合存储完全二叉树
二叉树的链式存储
typedef struct BiTNode
{
ElemType data; //数据域
struct BiTNode *lchild, *rchild; //左、右孩子指针
}BiTNode, *BiTree;
n 个结点的 二叉链表 \color{red}二叉链表 二叉链表共有 n + 1 个空链域 \color{red}n+1个空链域 n+1个空链域
可以用于构造线索二叉树 \color{pink}可以用于构造线索二叉树 可以用于构造线索二叉树
typedef struct BiTNode
{
ElemType data; //数据域
struct BiTNode *lchild, *rchild; //左、右孩子指针
}BiTNode, *BiTree;
int main()
{
BiTree root = NULL; //定义一颗空树
// 插入根结点
root = (BiTree)malloc(sizeof(BiTNode));
root->data = {1};
root->lchild = NULL, root->rchild = NULL;
// 插入新结点
BiTNode* p = (BiTree)malloc(sizeof(BiTNode));
p->data = {2};
p->lchild = NULL, p->rchild = NULL;
root->lchild = p; //作为根节点的左孩子
return 0;
}
如果想要快速找到结点 p 的父结点,我们可以再建立一个指向父结点的指针。
typedef struct BiTNode
{
ElemType data; //数据域
struct BiTNode *lchild, *rchild; //左、右孩子指针
struct BiTnode *parent; //父节点指针
}BiTNode, *BiTree;
知识点回顾与重要考点
二叉树的顺序存储中, 一定要把二叉树的结点编号与完全二叉树对应起来 \color{red}一定要把二叉树的结点编号与完全二叉树对应起来 一定要把二叉树的结点编号与完全二叉树对应起来
- i的左孩子: 2 i 2i 2i
- i的右孩子: 2 i + 1 2i + 1 2i+1
- i的父节点: ⌊ i / 2 ⌋ \lfloor i/2 \rfloor ⌊i/2⌋
- i所在的层次: ⌈ log 2 ( n + 1 ) ⌉ 或 ⌊ log 2 n ⌋ + 1 \lceil\log_2(n+1)\rceil\text{或}\lfloor\log_2n\rfloor+1 ⌈log2(n+1)⌉或⌊log2n⌋+1
最坏情况:
高度为h且只有h个结点的单支树(所有结点只有右孩子),也至少需要
2
h
−
1
2^h-1
2h−1 个存储单元
结论:
二叉树的顺序存储结构,只适合存储完全二叉树
typedef struct BiTNode
{
ElemType data; //数据域
struct BiTNode *lchild, *rchild; //左、右孩子指针
}BiTNode, *BiTree;
n 个结点的 二叉链表 \color{red}二叉链表 二叉链表共有 n + 1 个空链域 \color{red}n+1个空链域 n+1个空链域