主要内容 #
- 中序遍历
- 总结
1. 中序遍历 #
经过上节课的学习我们知道:
二叉排序树也叫二叉搜索树、二叉查找树,简称 BST(Binary Search/Sort Tree)树,它是一种特殊的二叉树,我们重点关注「排序」二字,二叉排序树要求在树中的任意一个节点,其左子树中的每个节点的值,都要小于这个节点的值,而右子树节点的值都大于这个节点的值,所以这么看来,二叉排序树是天然有序的。
如果按照中序遍历,得到的结果将是一个从小到大的有序数据集:
void in_order(node root){
node p = root;
if (p != NULL){
in_order(p->left);
printf("%lf\n", p->value);
in_order(p->right);
}
}
void in_order(node root){
node p = root;
if (p != NULL){
in_order(p->left);
printf("%lf\n", p->value);
in_order(p->right);
}
}
void in_order(node root){ node p = root; if (p != NULL){ in_order(p->left); printf("%lf\n", p->value); in_order(p->right); } }
对于上述的序列“62,58,88,47,73,99,35,51,93,29,37,49,56,36,48,50”其中序遍历的结果为:
29.000000
35.000000
36.000000
37.000000
47.000000
48.000000
49.000000
50.000000
51.000000
56.000000
58.000000
63.000000
73.000000
88.000000
93.000000
99.000000
29.000000
35.000000
36.000000
37.000000
47.000000
48.000000
49.000000
50.000000
51.000000
56.000000
58.000000
63.000000
73.000000
88.000000
93.000000
99.000000
29.000000 35.000000 36.000000 37.000000 47.000000 48.000000 49.000000 50.000000 51.000000 56.000000 58.000000 63.000000 73.000000 88.000000 93.000000 99.000000
2. 总结 #
二叉排序树是一种实现动态查找表的树形存储结构。同一张查找表中,元素的排序顺序不同,最终构建出的二叉排序树也不一样。
例如,{45,24,53,12,37,93} 和 {12,24,37,45,53,93} 是同一张动态查找表,只是元素的排序顺序不同,它们对应的二叉排序树分别为:
左侧二叉排序树表示的是 {45,24,53,12,37,93},右侧二叉排序树表示的是 {12,24,37,45,53,93}。
这里我们引入平均查找长度的概念:平均查找长度ASL=∑(本层高度*本层元素结点个数)/结点总数
这里我们引入平均查找长度的概念:平均查找长度ASL=∑(本层高度*本层元素结点个数)/结点总数
这里我们引入平均查找长度的概念:平均查找长度ASL=∑(本层高度*本层元素结点个数)/结点总数
二叉排序树的查找性能和整棵树的形态有关。以上图为例,假设查找表中元素被查找的概率是相等的(都为1/6),左侧二叉排序树的查找性能用平均查找长度(ASL)表示:
ASL = 1/6 * (1+2+2+3+3+3) = 14/6
ASL = 1/6 * (1+2+2+3+3+3) = 14/6
ASL = 1/6 * (1+2+2+3+3+3) = 14/6
右侧二叉排序树的查找性能为:
ASL = 1/6 * (1+2+3+4+5+6) = 21/6
ASL = 1/6 * (1+2+3+4+5+6) = 21/6
ASL = 1/6 * (1+2+3+4+5+6) = 21/6
ASL 值越小,查找的性能就越高。显然,图 4 左侧二叉排序树的查找性能更高。
也就是说,一张动态查找表往往对应着多棵二叉排序树,当表中元素的查找概率相同时,二叉排序树的层数越少,查找性能越高。