二叉搜索树python实现——python——系列2

今天再抽空,把其它的整完,完全按照教材思路来编写,所以可能效率会差,或者编码技巧性不强,大家自己完善吧,教材上的代码不好处理空树的情况,所以我们这里加了个小小的判断,每次找根节点,从根节点出发查找。

  1. BST上查找——最小值:find_min(),这个只要记住BST上节点值最小的就是树上最左边的节点。就一直找左边,直到某个没有左子的节点为止,就是要找的东东了
    def find_min(self, *args): # 查找BST上最小值:其实就是树上最左边的节点
        if len(args) == 0: # 没给出参数,则找到BST的根节点
            node = self.Root
        else: #否则找到当前节点作为根节点
            node = args[0]
            
        if not node.left: #直到某个没有左子的节点为止,该节点就是最小的点
            return node
        else:
            return self.find_min(node.left)

测试代码:

print("The minimum value in this BST is %d" % tree.find_min().key)

测试结果,课本例子:

The minimum value in this BST is 39
  1. BST上查找——最大值:find_max(),废话不说了,就是右右右blablabla
    def find_max(self, *args):
        if len(args) == 0:
            node = self.Root
        else:
            node = args[0]
            
        if not node.right:
            return node
        else:
            return self.find_max(node.right)

测试代码,这个课本上没有,但是思路一样:

print("The maximum value in this BST is %d" % tree.find_max().key)

测试结果:

The maximum value in this BST is 51
  1. BST上查找——次大值:next_larger(), 算法思路(1)找到该节点;(2)查找该节点右子树上最小的点;(3)如果该节点无右子树,则查找左双亲节点的右双亲节点。OK,看代码
    def next_larger(self, key):
        if self.find(key) is None:
            print("no exist this node")
        else:
            node = self.find(key)
            if node.right is not None: #有右子树的情况
                print("The node %d has right child, its next larger node is %d!" % (key, self.find_min(node.right).key))
            else: #没有右子树的情况
                leftparent = node.parent
                rightparent = leftparent.parent
                print("The node %d has no right, its next larger node is %d!" % (key, rightparent.key)) 

测试代码:

A = [46, 39, 49, 44, 51]
tree.next_larger(49)

测试结果,就用课本上的例子:

The node 49 has right child, its next larger node is 51!
The node 44 has no right, its next larger node is 46!
  1. 本次查找功能Over,还有个查找find,请看上一个系列即可。

你可能感兴趣的:(作业题)