当前位置:文档之家› 5.2-3 (有修改)二叉树ADT及存储表示

5.2-3 (有修改)二叉树ADT及存储表示


Content

1
二叉树2二叉树的遍历3
树和森林4堆和优先权队列5哈夫曼树及其应用
6
PART TWO
二叉树
•二叉树的定义和性质
•特殊二叉树
•二叉树ADT与存储表示
•二叉树的基本运算
二叉树ADT
ADT BinaryTree{
数据:
二叉树是结点的有限集合,它或者为空集合,或者由一个根和两棵子树构成,这两棵子树也是二叉树。

运算:
Create(bt):构造一棵空二叉树bt。

NewNode(x,ln,rn):创建一个新节点,该结点的值为x,ln和rn为该结点的左右孩子结点。

IsEmpty(bt):若二叉树bt为空,则返回TRUE,否则返回FALSE。

ClearTree(bt):清除二叉树bt中的所有结点,使之成为空二叉树。

Root(bt,x):若二叉树bt非空,则获取根结点中的数据,并返回TRUE,否则返回FALSE。

MakeTree(bt,x,left,right):构造一棵二叉树bt,根结点的值为x,left和right为该根结点的左右子树。

PreOrderTree(bt):先序遍历二叉树bt。

InOrderTree(bt):中序遍历二叉树bt。

PostOrderTree(bt):后序遍历二叉树bt。

……
}
性质6: 对完全二叉树中的结点,按照从上到下、从左到右依次顺
序从0开始编号,则对于编号为i的节点而言,可知:
•若i=0,则该结点为根结点
•若i>0,则该结点的父节点为⎣(i-1)/2⎦
•若2i+1<n,则该结点的左孩子为2i+1,否则无左孩子
•若2i+2<n,则该结点的右孩子为2i+2,否则无右孩子
•完全二叉树的顺序存储表示:
✓结点按从上到下、从左到右,逐层顺序存储于一块连续的存储单元(即数组)✓根结点存储在下标为0的位置,其他结点按上述性质中的编号规则依次顺序存储
50
25
75
10
29
55
80
4152701245789
365025751029558041527
0 1 2 3 4 5 6 7 8 9
数组A
一般的二叉树可以用数组存储吗

:空结点•一般二叉树的顺序存储表示
1.通过在一般二叉树中增加“空结点”,将
二叉树改造成完全二叉树;
2.将包含“空结点”的“完全二叉树”用数
组存储。

理论上可行,但可能存在较大的空间浪费!
∧:空结点
示例:设有一棵包含100个结点、且高度也是100的二叉树1
2
100
1
2
100……
100个结点2100-1个结点结论:在实际应用中,顺序存储结构往往并不适用一般的二叉树
•二叉树的链接表示
lC hild elem en t rC hild
A
B C
D E F
(a) 二叉树
A
B∧C
∧D∧∧E∧∧F∧
root
(b) 二叉树的链接表示
当前的二叉树的链接结构有利于从双亲到孩子方向的访问
•二叉树的链接表示
A
B ∧
C
∧D ∧
∧E ∧
∧F ∧
root
二叉树的链接表示
typedef struct btnode{ElemType element;
struct btnode *lChild; struct btnode *rChild;
}BTNode;
typedef struct binarytree{
BTNode * root; }BinaryTree;
二叉树的存储表示
•二叉树的链接表示(扩展)
typedef struct btnode{
ElemType element;
struct btnode*lChild;
struct btnode*rChild;
struct btnode*parent; }BTNode;
root
A
B∧C
∧D∧∧E∧∧F∧

➢如果在二叉链表结点中增加一个parent 域,令它指向该结点的双亲结点,就可以实现二叉树的双向链接结构。

Good Bye NEXT:二叉树的基本运算。

相关主题