一、数组存储二叉树的简单介绍
1.数组元素:A B C D E F G H I J
对应下标:0 1 2 3 4 5 6 7 8 9
堆结构: A
B C
D E F G
2.父子间下标关系的计算公式:
①leftchild=parent*2+1
rightchild=parent*2+2
注意:左孩子始终为奇数,右孩子始终为偶数。
②parent=(child-1)/2
3.数组可存储full binary tree和complete binary tree.
注:只有complete binary tree 和full binary tree才适合使用数组存储,否则容易造成空间浪费。
二、二叉树的简单性质
1.对于非空树而言:度数为2的分支节点有n2个,度数为0的分支节点有n0个,则:n0=n2+1.
2.具有n个结点的满二叉树的深度:log2(n+1)。
【例题】求2n个结点的完全二叉树中叶子结点的个数。
【解】设度数为0,1,2的结点分别有N0,N1,N2个,则:
N0+N1+N2=2n
N2=N0-1
联立可得:2N0+N1=2n+1
利用完全二叉树的特点:完全二叉树中,度数为1的结点最多有1个。
因为2N0,2n都是偶数,所以必有N1=1.
故N0=n,即叶子结点有n个。
【例】A complete binary tree has 531 vertices. What's its height?
Solution:
For a complete binary tree, each leaf is of height H-1 or H,and a full binary tree of height 9 has 511vertices, a full binary tree of height 10 has 1023vertices.
Thus its height is 10.
【例】A complete binary tree has 767 vertices. What's the number of its leaves?
Solution: For a complete binary tree, N2=N0+1
N1=0 or N1=1
N1+N2+N0=767.
Combine these three expressions, we can derive N0=384.
Thus the number of leaves is 384.
三、二叉树的具体实现
1.用数组可表示满二叉树、完全二叉树,依据父子结点下标的计算公式进行求解。
2.二叉链表:从一个结点可寻找其两个孩子结点。
3.三叉链表:从一个结点可寻找到其孩子结点与双亲结点。
四、多叉树的实现方式——孩子兄弟表示法
//存储多叉树的最佳表示法——孩子兄弟表示法
typedef int DataType;
struct TreeNode {
struct TreeNode* firstChild;//第一个孩子结点
struct TreeNode* pNextBrother;//指向下一个兄弟结点
DataType data;
};
五、堆的基本概念
1.堆的性质:
①堆中某个结点的值总是不大于或不小于其父节点的值。
②堆总是一棵完全二叉树。
2.分类:大根堆(大堆)、小根堆(小堆)。
3.应用:堆排序、优先级队列等。
4.堆的物理结构可用数组实现,利用父子结点的下标关系式即可实现堆的相关操作。