解析:
折半查找判定树实际上是一棵二叉排序树,它的中序序列是一个有序序列。可以在树结点上依次填上相应的元素,符合折半查找规则的树即是所求。
选项A符合折半查找规则,因此正确。10个元素时的折半查找判定树应是A答案的图(向上取整)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=72095ed82559252da3171d0c0499032c/307fb6003af33a8742a0bcd8835c10385143b5ee.jpg?tbpicau=2025-03-01-05_f5a2666d206ce04447bd80e0d036e598)
11个元素时折半查找判定树(向上取整)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=9ce0410e86cec3fd8b3ea77de68ad4b6/ebb21bd5ad6eddc4742808397cdbb6fd506633ef.jpg?tbpicau=2025-03-01-05_4640c3079b320c5eb0a55e947aa83e91)
其实在代码实现的时候到底用是向下取整,还是向上取整并不重要,只要保持一致性,即要么一直向下取整,要么一直向上取整,就能实现折半查找。
下面是分别是10个与11个元素向下取整实现的折半查找判定树,不难发现其结正好与个数相同的向上取整的判定树水平对称。
![](http://tiebapic.baidu.com/forum/w%3D580/sign=942c201ecf13632715edc23ba18da056/d82b55fbb2fb4316e8d1c6b865a446230bf7d3e9.jpg?tbpicau=2025-03-01-05_79d0379510f53e9b482a5441f4d7580e)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=5f2928b6e8345982c58ae59a3cf6310b/cb9ba3cc7cd98d10c91db0f3643fb80e79ec90ea.jpg?tbpicau=2025-03-01-05_8ed932be3703c0453d227a298ad509a7)
技巧:
当表中元素个数为偶数个时,那么折半所产生的子表中,必然会出现两种情况:①前子表比后子表多一个元素(向上取整);②后子表比前子表多一个元素(向下取整);那么以这种结构推其后所有的子表应均满足此结构,如果按惯例坚持向上取整的话可以排除D答案。
当表中元素个数为奇数个时,那么折半所产生的子表中,只会产生一种情况,即前后子表元素个数相同,那么以这种结构推其后所有的子表应均满足此结构。折半查找判断树是执行折半查找过程中形成的树,那么他的子树有着相同的结构,但不可能是对称结构。可以排除B、C答案,若二叉树出现例如上题中BC此类关于根节点对称的结构,那么它一定不是折半查找二叉树。
代码:
另外,书上的这个程序与许多网站代码都用的是int mid = (low + high) / 2 来求中位数; 但这名代码low与higth两个加起是基数时,要用靠后面数为中位数,如1,...,10,应取6为中位数,要向上取整用前面的代码无法实现,应该是int mid = (low + high+1) / 2才对的;而int mid = (low + high+1) / 2则是向下取整的代码。