我正在二元搜索树上尝试这个继任者和前任。
只是想知道一旦我掌握了后继代码,我可以将其翻转并将其用于前任代码吗? 我编写了后继者,并尝试将其用于前任。 但是,即使我试图放置其他值,我的输出值也不会改变。
以下是我的代码:
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
答案 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的节点就是这种情况。它会一直沿父指针经过根节点。
如果有一个前任节点,那么它将是您左移树后遇到的第一个父节点。换句话说,它是父节点,其值小于您从其开始的节点的值。因此,上面的节点17将返回值为15的根节点。
前身
def bst_maximum(tree):
maximum = tree
while maximum is not None:
maximum = maximum.right
return maximum
由于后继者只是前任者的对称操作,因此可以通过翻转各种操作来修改前任者。即:
后继
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