当前位置: 首页 > 知识库问答 >
问题:

如何通过在Python中交换节点来修复或纠正BST?

张亦
2023-03-14

我有一个错误的BST,其中两个节点不在正确的位置。我知道BST的无序遍历是排序的。因此,我用三个指针遍历树:第一、最后、中间。如果当前节点小于上一个节点,我将上一个设置为第一个,将当前节点设置为中间节点。这是第一次违规。当第二个冲突发生时,我将最后一个指定为当前节点。现在,当最后一个为<code>NULL</code>时,先交换第一个和第二个,当最后最后一个不是<code>NULL</code>时,首先交换最后一个。这就是我所做的:

class Node:
   def __init__(self,data):
      self.data = data
      self.left = None
      self.right = None


def fixBST(root,first,middle,last,prev):

    if( root ): 


        fixBST( root.left, first, middle, last, prev )

        if (prev and root.data < prev.data): 

            if ( first is None ): 

                first = prev 
                middle = root 

            else:
                last = root


        prev = root


        fixBST( root.right, first, middle, last, prev )
        return (first,middle,last)


def correctBST( root ): 


    first = middle = last = prev = None 


    first,middle,last = fixBST( root, first, middle, last, prev ) 

    if( first and last ): 
              t = first.data 
              first.data = last.data 
              last.data = t 
    elif( first and middle ): 
              t = first.data 
              first.data = middle.data 
              middle.data = t 



def printInorder(node): 

    if (node == None): 
        return
    printInorder(node.left)
    print node.data
    printInorder(node.right) 



root = Node(6)
root.left     = Node(10) 
root.right     = Node(2) 
root.left.left = Node(1) 
#root.left.right = Node(3) 
#root.right.right = Node(12) 
#root.right.left = Node(7) 

print "Inorder Traversal of the original tree \n" 
printInorder(root)

correctBST(root)

print "\nInorder Traversal of the fixed tree \n"
printInorder(root)

第二次打印顺序遍历后,我得到相同的错误树。我相信第一个、中间、最后一个值没有被存储?我错过了什么吗?

编辑:我编辑了代码。但是first、middle和last的返回值仍然是None。难道不是正确的方法吗?

共有1个答案

闾丘谦
2023-03-14

您的函数固定BST交换什么都不做。第一个中间最后一个仅限于固定BST的本地范围,所以从这个意义上说,是的,它们不被存储。Python通过赋值传递。

def swap(a,b): 

    t = a 
    a = b 
    b = t 

a, b = 1, 2
swap(a, b)
print(a, b)
# 1 2

您应该做的是返回一个值并重新分配或使用全局范围:

# Reassign
def swap(a,b): 
    return b, a

a, b = 1, 2
a, b = swap(a, b)
print(a, b)
# 2 1

# Global
a, b = 1, 2
def swap():
    global a
    global b
    t = a
    a = b
    b = t
swap()
print(a, b)
# 2 1

也许重新分配是应该走的路。

 类似资料:
  • 我在实现哈夫曼算法,为此我使用了一个双链表。实现需要对列表进行排序,但仅仅交换数据是不够的——我需要交换整个节点。然而,这比我预想的要复杂一些。 我使用了这个选择排序的变体,但它会导致访问冲突错误。我假设这是因为我试图访问某个空指针,这两个条件本应阻止它。 任何帮助或建议都将不胜感激。

  • 问题内容: 我已经通过npm install安装了节点模块,然后尝试在命令提示符下执行gulp sass-watch。之后,我得到以下回应。 在gulp sass-watch之前尝试过这个 问题答案: 我遇到了同样的错误。我怀疑您正在使用节点12和gulp3。该组合不起作用:https : //github.com/gulpjs/gulp/issues/2324 从1月开始的以前的解决方法也不起作

  • 我已经通过npm install安装了节点模块,然后我尝试在命令提示符下执行gulp sass-watch。之后我得到了下面的回应。 我以前也试过

  • 我在谷歌上搜索了这个,但他们都在谈论“交换节点而不交换数据”。 我尝试自己编写一个交换节点方法: 如您所见,和相互更改,但打印结果不交换。如何交换两个节点及其数据? 编辑:下面的完整示例

  • 我刚开始学习javascript和nodejs(express和ejs)来开发我的公文包。当我运行下面的javascript时,我遇到了错误。有人能帮我吗 终端显示此错误。 在Object中未定义文档。(C:\用户\milkc\WebDevelopment\实践\sassPortfolio\index.js:21: 17)。_compile(内部/模块/cjs/loader.js:701: 30)

  • 我正在将一个包含大量自定义绘制的Swing/Graphics2D应用程序转换为JavaFX2应用程序。虽然我非常喜欢这个新的API,但当我在鼠标光标下方绘制椭圆时,无论鼠标移动到哪里,我似乎都会遇到性能问题。当我以稳定的方式移动鼠标时,我注意到椭圆总是在鼠标轨迹的后面几厘米处绘制,只有当我停止移动光标时,椭圆才会出现。这是一个只有少数节点的场景图。在我的Swing应用程序中,我没有这个问题。 我想