如何解决python中树的左右旋转 1分配应该是无条件的 2双线程
我使用课程:
var $rows = $('#myTable tr:gt(0)');
$('#SomeID').keyup(function () {
var val = $.trim($(this).val()).replace(/ +/g,' ').toLowerCase();
$rows.hide().filter(function () {
var text = $(this).text().replace(/\s+/g,' ').toLowerCase();
return ~text.indexOf(val);
}).show();
});
我已经创建了这棵树:
class Node:
def __init__(self,value):
self.key = value
self.left = None
self.right = None
self.parent = None
我尝试了以下代码:
n_12 = Node(12)
n_15 = Node(15)
n_3 = Node(3)
n_7 = Node(7)
n_1 = Node(1)
n_2 = Node(2)
n_not1 = Node(-1)
n_12.right = n_15
n_12.left = n_3
n_3.right = n_7
n_3.left = n_1
n_1.right = n_2
n_1.left = n_not1
n_12.parent = None
n_15.parent = n_12
n_3.parent = n_12
n_7.parent = n_3
n_1.parent = n_3
n_2.parent = n_1
n_not1.parent = n_1
但是它不起作用,它使用根节点def rightRotate(t):
if t == None or t.left == None:
return None
n = t
l = t.left
r = t.right
lr = t.left.right
ll = t.left.left
t = t.left
t.right = n
if r != None:
t.right.right = r
if lr != None:
t.right.left = lr
if ll != None:
t.left = ll
删除了一些节点。为什么它不起作用,我也不明白为什么我没有所有节点。如果我叫n_12
,则会遇到无限循环。
解决方法
您编写“我有一个无限循环” ,但是您的代码没有循环,因此这一定发生在代码的其他地方。
我看到两个问题:
1)分配应该是无条件的
if lr != None:
t.right.left = lr
lr is None
时还需要 此分配。如果不是,t.right.left
将保持等于l
的那一刻的t
,因此您的树中确实有一个循环。
2)双线程
您的树是双线程的,即它也具有parent
链接。但是这些不会在您的rightRotate
函数中更新。因此,要么不使用parent
链接(最好),要么修改您的代码,以使parent
链接也根据轮换进行更新。
其他备注:
以下代码可以简化:
if r != None:
t.right.right = r # was already equal to r
if lr != None:
t.right.left = lr # see above. should not be behind a condition
if ll != None:
t.left = ll # was already equal to ll
因此可以简化为:
t.right.left = lr
甚至:
n.left = lr
最终密码
通过上述更改,您的功能可能是:
class Node:
def __init__(self,value):
self.key = value
self.left = None
self.right = None
self.parent = None
def rightRotate(node):
if node is None or node.left is None:
return node
parent = node.parent
left = node.left
left_right = left.right
# change edge 1
if parent: # find out if node is a left or right child of node
if parent.left == node:
parent.left = left
else:
parent.right = left
left.parent = parent
# change edge 2
left.right = node
node.parent = left
# change edge 3
node.left = left_right
if left_right:
left_right.parent = node
return left # the node that took the position of node
# your code to build the tree
n_12 = Node(12)
n_15 = Node(15)
n_3 = Node(3)
n_7 = Node(7)
n_1 = Node(1)
n_2 = Node(2)
n_not1 = Node(-1)
n_12.right = n_15
n_12.left = n_3
n_3.right = n_7
n_3.left = n_1
n_1.right = n_2
n_1.left = n_not1
n_12.parent = None
n_15.parent = n_12
n_3.parent = n_12
n_7.parent = n_3
n_1.parent = n_3
n_2.parent = n_1
n_not1.parent = n_1
# rotate the root
root = n_12
root = rightRotate(root) # returns the node that took the place of n_12
只需删除带有parent
的行即可获得单线程版本。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。