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的行即可获得单线程版本。