顺序存储
定义一个长度为MaxSize的数组t,按照从上至下、从右至左的顺序依次存储完全二叉树的各个节点
实现代码
1 2 3 4 5 6
| #define MaxSize 100 struct TreeNode { int value; bool isEmpty; }; TreeNode t[MaxSize];
|
初始化操作
1 2 3 4
| for (int i =0; i < MaxSize; i++) { t[i].isEmpty = true; }
|
基本操作
i的左孩子: 2i
i的右孩子: 2i+1
i的父节点: [i/2]
i所在的层次: [log2(n+1)]或[log2n]+1
二叉树的顺序存储中,一定要把二叉树的结点编号与完全二叉树对应起来
时间分析
最坏情况:
高度为h且只有h个结点的单支树(所有节点只有右孩子),也至少需要2^h-1个存储单元
结论:
二叉树的顺序存储结构,只适合存储完全二叉树
链式存储
1 2 3 4 5
| typedef struct BiTNode { int data; struct BiTNode *lchild, *rchild; }BiTNode, *BiTree;
|
n个结点的二叉链表共有n+1个空链域,可以用于构造线索二叉树
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| typedef struct BiTNode { int data; struct BiTNode *lchild, rchild; }BiTNode, *BiTree;
BiTree root = NULL;
root = (BiTree)malloc(sizeof(BiTNode)); root->data = {1}; root->lchild = NULL; root->rchild = NULL;
BiTNode *p = (BiTNode *)malloc(sizeof(BiTNode)); p->data = {2}; p->lchild = NULL; p->rchild = NULL; root->lchild = p;
|
1 2 3 4 5 6
| typedef struct BiTNode { int data; struct BiTNode *lchild, rchild; struct BiTNode *parent; }BiTNode, *BiTree;
|
三叉链表,方便找到父节点