document.write('
首先需要找出二叉排序树中的最大值与最小值。由于二叉排序树的特点是:对于任意一个结点,它的左
子树上所有结点的值都小于这个结点的值,它的右子树上所有结点的值都大于这个结点的值。因此,在
二叉排序树中,最小值一定是最左下的结点,最大值一定是最右下的结点。根据最大值与最小值很容易
就可以求出f的值。接下来对二叉树进行中序遍历。如果当前结点的值小于f,那么在这个结点的右子树
中接着遍历,否则遍历这个结点的左子树。实现代码如下:
class BiTNode:
def __init__(self):
self.data=None
self.lchild=None
self.rchild=None
"""
方法功能: 查找值最小的结点
输入参数: root:根结点
返回值: 值最小的结点
"""
def getMinNode(root):
if root==None:
return root
while root.lchild!=None:
root=root.lchild
return root
"""
方法功能: 查找值最大的结点
输入参数: root:根结点
返回值: 值最大的结点
"""
def getMaxNode(root):
if root==None:
return root
while root.rchild!=None:
root=root.rchild
return root
def getNode(root):
maxNode=getMaxNode(root)
minNode=getMinNode(root)
mid=(maxNode.data+minNode.data)/2
result=None
while root!=None:
#当前结点的值不大于f, 则在右子树上找
if root.data<=mid:
root=root.rchild
#否则在左子树上找
else:
result=root
root=root.lchild
return result
if __name__=="__main__":
arr=[1,2,3,4,5,6,7]
root=arraytotree(arr,0,len(arr)-1)
print getNode(root).data
程序的运行结果为:
5
算法性能分析:
这种方法在查找最大结点与最小结点时的时间复杂度为O(h),h为二叉树的高度,对于有N个结点的
二叉排序树,最大的高度为O(N),最小的高度为O(log2N)。同理,在查找满足条件的结点的时候,时
间复杂度也是O(h)。综上所述,这种方法的时间复杂度在最好的情况下是O(logN),最坏的情况下为
O(N)。
');