算法导论程序28--查询二叉搜索树(Python)

我们经常需要查找一个存储在二叉搜索树中的关键字,除了SEARCH操作之外,二叉搜索树还能支持诸如MINIMUM、MAXIMUM、SUCCESSOR和PREDECESSOR的查询操作。

在任何高度为h的二叉搜索树上,如何在O(h)的时间内执行完每个操作。

查找:

在一棵二叉搜索树中查找一个具有给定关键字的节点,输入一个指向树根的指针和一个关键字k,如果这个结点存在,返回一个指向关键字k的结点的指针,否则返回NIL。

class Node:
    def __init__(self,key,right,left,p):
        self.key=key
        self.right=right
        self.left=left
        self.p=p

class tree:
    def __init__(self,root):
        self.root=root
    def tree_insert(self,z):
        y=None
        x=self.root
        while x!=None:
            y=x
            if z.key<x.key:
                x=x.left
            else:
                x=x.right
        z.p=y
        if y==None:
            self.root=z
        elif z.key<y.key:
            y.left=z
        else:
            y.right=z
    def inorder_tree_walk(self,x):
        if x!=None:
            self.inorder_tree_walk(x.left)
            print(x.key)
            self.inorder_tree_walk(x.right)
    def tree_search(self,x,k):
        if x==None or k==x.key:
            return x
        if k < x.key:
            return self.tree_search(x.left,k)
        else: return self.tree_search(x.right,k)

    def iterative_tree_search(self,x,k):
        while x!=None and k!=x.key:
            if k<x.key:
                x=x.left
            else:
                x=x.right
        return x
    def tree_minimum(self,x):
        while x.left!=None:
            x=x.left
        return x
    def tree_maximum(self,x):
        while x.right!=None:
            x=x.right
        return x
    def tree_successor(self,x):
        if x.right!=None:
            return self.tree_minimum(x.right)
        y=x.p
        while y!=None and x==y.right:
            x=y
            y=y.p
        return y

    
    
运行:

>>> root=Node(15,None,None,None)
>>> t=tree(root)
>>> T=[6,18,3,7,17,20,2,4,13,9]
>>> for i in T:
	r=Node(i,None,None,None)
	t.tree_insert(r)
>>> x=t.tree_search(t.root,20)
>>> x.key
20
>>> x
<__main__.Node object at 0x03E01DF0>
>>> x.p
<__main__.Node object at 0x03E012F0>
>>> x.p.key
18
>>> t.tree_minimum(t.root)
<__main__.Node object at 0x03E01E10>
>>> x=t.tree_minimum(t.root)
>>> x.key
2
>>> x=t.tree_maximum(t.root)
>>> x.key
20





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值