succ和Predecessor - 二叉搜索树(Python)

时间:2016-03-17 17:33:25

标签: python

我正在二元搜索树上尝试这个继任者和前任。

只是想知道一旦我掌握了后继代码,我可以将其翻转并将其用于前任代码吗? 我编写了后继者,并尝试将其用于前任。 但是,即使我试图放置其他值,我的输出值也不会改变。

以下是我的代码:

SUCC

/^(a|A)([0-9]{6})$/

前身

def succ(self, key):
    temp = self.root
    prev = None
    if (temp.right is not None):
        temp  = temp.right
        while (temp.left is not None):
            temp = temp.left
        prev = temp
    elif temp.left is not None:e
        temp = temp.left
        while (temp.right is not None):
            temp = temp.right
        prev = temp
    else:
        return None
    return prev.key

def pred(self, key):
        temp = self.root
        prev = None
        #if right is not none, succ lies in the right sub tree
        if (temp.right is not None):
            temp  = temp.right
            while (temp.left is not None):
                #return the node with the minimum key value
                temp = temp.left
            prev = temp
        #if left not none, succ lies in the right sub tree
        elif temp.left is not None:
            #go right till .right is None
            #return the node with the maximum key value
            temp = temp.left
            while (temp.right is not None):
                temp = temp.right
            prev = temp
        else:
            #no succ
            return None
        return prev.key

2 个答案:

答案 0 :(得分:3)

要翻转>>> import urlparse >>> url = 'http://sitename.com/pathname?title=moviename&url=VIDEO_URL' >>> urlparse.parse_qs(urlparse.urlparse(url).query) {'title': ['moviename'], 'url': ['VIDEO_URL']} 功能并将其转换为succ,您需要将每pred更改为left,并将每right更改为right {1}}。

left

答案 1 :(得分:0)

让我们假设您有一个BST节点类,该类具有三个指针/引用:左,右和父级,分别对应于给定节点的左子级,右子级和父级。树中唯一一个父节点指向“无”的节点将是根节点。

让我们还假设我们具有以下BST:

11 % 2

BST属性指出,对于任何给定节点 n n 左子树中的所有节点均应小于 n ;并且, n 的右子树中的所有节点都应大于 n

为使实现后继功能和前任功能更容易,拥有辅助功能有助于查找给定BST或BST子树的最小和最大节点。

最小

       15
     /     \
    9       20
   / \     /  \
  3   10  17   21
 / \    \
1   5   11

最大值

def bst_minimum(tree):
  minimum = tree
  while minimum is not None:
    minimum = minimum.left
  return minimum

对于上面的树示例,这些函数将为最小值返回1,为最大值返回21。

要找到给定节点的前身,您必须涵盖以下几种情况:

  1. 如果给定节点具有左子树,则采用该子树的最大值。
  2. 否则,将树向上移动,跟随父节点,直到您单击“无”或“向左转”。

在第二种情况下,如果您单击“无”,则表示没有前任。上面的树中值为1的节点就是这种情况。它会一直沿父指针经过根节点。

如果有一个前任节点,那么它将是您左移树后遇到的第一个父节点。换句话说,它是父节点,其值小于您从其开始的节点的值。因此,上面的节点17将返回值为15的根节点。

前身

def bst_maximum(tree):
  maximum = tree
  while maximum is not None:
    maximum = maximum.right
  return maximum

由于后继者只是前任者的对称操作,因此可以通过翻转各种操作来修改前任者。即:

  1. 您要检查右侧的树并找到其最小值,而不是检查左侧的子树并找到最大值。
  2. 否则,请遵循父节点,直到无法再运行(在这种情况下将没有后继节点),或者右转。因此,节点5的后继者将是上面树中的节点9。

后继

def bst_predecessor(tree):
  if tree.left is not None:
    return bst_maximum(tree.left)
  parent = tree.parent
  child = tree
  while parent is not None and child is parent.left:
    child = parent
    parent = child.parent
  return parent