python - 如何通过交换 Python 中的节点来修复或更正 BST?
问题描述
我有一个不正确的 BST,其中两个节点不在正确的位置。我知道 BST 的中序遍历是排序的。因此,我用三个指针遍历树:第一个、最后一个、中间。如果当前节点小于前一个节点,我将前一个节点设置为第一个,当前节点设置为中间。这是第一次违规。当发生第二次违规时,我将 last 分配为当前节点。现在当 last 是NULL
,交换第一个和中间,当 last 不是NULL
交换第一个和最后一个。这就是我所做的:
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。这不是正确的方法吗?
解决方案
你发挥作用fixBST
,swap
什么也不做。first
, middle
, 和last
仅限于 的本地范围fixBST
,所以从这个意义上说是的,它们没有被存储。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
可能重新分配是要走的路。
推荐阅读
- c# - 如何使用 C# 自动化 SAP GUI 750
- logging - 从 Roku 提取带宽日志
- php - 使用 PHP 显示 MySQL 行 - 表依赖
- python - 积分可能是发散的,或缓慢收敛的
- c++ - 有没有更好的方法来编写这个 c++ 代码
- django - Django:使用对象创建后的秒数注释 QuerySet
- angular - 使用 Jasmine 和 Karma 进行 Angular 单元测试中的 Mock Base 服务
- r - R中的复发事件生存分析
- java - 如何创建、读取和写入 sharedPreferences 文件?
- python - 在遍历字符串列表时搜索特定值以在 Python 中的字符串列表中查找匹配项