二叉判定树,具有以下性质:
- 若左子树不为空,则左子树上各个节点的值 均小于 其根节点的值
- 若右子树不为空,则右子树上各个节点的值 均大于或等于 其根节点的值
- 左、右子树也分别具有上面两个特点
已知一个顺序存储是有序表为(15,26,34,39,45,56,58,63,74,76),试画出对应的二叉判定树,求其平均查找长度。
折半查找二叉判定树画法
【1】确定二叉判定树的深度(即:多少层)
-
序列总长度n = 10,而一棵深度为 h 的二叉树,节点数最多为(2^h) - 1
-
n > (2^3) - 1,所以该二叉判定树有4层,前面3层为满二叉树结构,剩余3个节点在第4层。
【2】确定二叉判定树的根节点
-
根节点下标:rootIndex = (startIndex + endIndex) / 2,在前面序列中有10个元素,所以startIndex = 0,endIndex = 9
-
(0 + 9) / 2 = 4,所以根节点下标为4,根节点的值为45
【3】确认根节点左右子树
-
45左侧元素 作为根节点的左子树
-
45右侧元素 作为根节点的右子树
【4】确定左子树部分的排序
-
45左侧元素,也就是15,26,34,39作为根节点的左子树部分
-
继续【2】中的父节点判断方式,(0 + 3) / 2 = 1,所以26是45的左孩子。15作为26的左孩子,34作为26的右孩子。剩下的39作为34的右孩子(注:为什么不是作为34的左孩子呢? 因为二叉判定树的左孩子<父节点,右孩子>父节点,而39>34,所以39作为34的右孩子,而不是左孩子)
【5】确定右子树部分的排序
-
45右侧元素,也就是56,58,63,74,76作为根节点的右子树部分
-
右子树的排序方式 和 左子树是一样的,所以这里省略了…
【6】该二叉判定树的整体结构: