繁体   English   中英

二叉搜索树的递归后继 function (Python)

[英]Recursive successor function for a binary search tree (Python)

我正在尝试编写一个 function ,它将在二叉搜索树中找到大于给定 x 的最小值(即 BST 中 x 的后继)。 我正在使用的 BST class 如下:

class BSTree:
    class Node:
        def __init__(self, val, left=None, right=None):
            self.val = val
            self.left = left
            self.right = right
            
    def __init__(self):
        self.size = 0
        self.root = None

    def add(self, val):
        assert(val not in self)
        def add_rec(node):
            if not node:
                return BSTree.Node(val)
            elif val < node.val:
                return BSTree.Node(node.val, left=add_rec(node.left), right=node.right)
            else:
                return BSTree.Node(node.val, left=node.left, right=add_rec(node.right))
        self.root = add_rec(self.root)
        self.size += 1
    def height(self):
        """Returns the height of the longest branch of the tree."""
        def height_rec(t):
            if not t:
                return 0
            else:
                return max(1+height_rec(t.left), 1+height_rec(t.right))
        return height_rec(self.root)
    
    def pprint(self, width=64):
        """Attempts to pretty-print this tree's contents."""
        height = self.height()
        nodes  = [(self.root, 0)]
        prev_level = 0
        repr_str = ''
        while nodes:
            n,level = nodes.pop(0)
            if prev_level != level:
                prev_level = level
                repr_str += '\n'
            if not n:
                if level < height-1:
                    nodes.extend([(None, level+1), (None, level+1)])
                repr_str += '{val:^{width}}'.format(val='-', width=width//2**level)
            elif n:
                if n.left or level < height-1:
                    nodes.append((n.left, level+1))
                if n.right or level < height-1:
                    nodes.append((n.right, level+1))
                repr_str += '{val:^{width}}'.format(val=n.val, width=width//2**level)
        print(repr_str)

我正在尝试为我自己对递归的理解编写一个递归实现,但我遇到了一些麻烦。 这是我到目前为止所拥有的:

def successor(self, x):
     
        def successor_rec(node):  
            if node is None: 
                return None
            if x < node.val:
                if node.left is not None and node.left.val > x: 
                    return successor_rec(node.left)
                else: 
                    return node.val
            else: 
                return successor_rec(node.right)
        
        return successor_rec(self.root)

考虑以下 BST:

t = BSTree()
    for x in [6, 3, 5, 4, 7, 1, 2, 9, 8, 0]:
        t.add(x)
 t.pprint()

                               6                                
               3                               7                
       1               5               -               9        
   0       2       4       -       -       -       8       -    

当我执行t.successor(4)时,我得到 6,虽然我想得到 5,即树中 4 的继承者。 我知道问题发生在 function else: return node.val的部分,尽管我正在努力解决这个问题。

您的if x < node.val块不正确。 例如,即使node.left.val < x ,您仍然应该 go 找到node.left的后继,因为它可能有一个右子树( node.left.right )。

这是一个更正:

            if x < node.val:
                attempt = successor_rec(node.left)
                return node.val if attempt is None else attempt

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM