在 Python 中制作几乎二叉搜索树(BST)以变为精确 BST 的程序
假设我们有一棵二叉树,它几乎是一棵二叉搜索树,只有两个节点的值被交换了。我们需要对其进行更正并返回二叉搜索树。
因此,如果输入如下所示:
那么输出将是:
为了解决这个问题,我们将遵循以下步骤:
- prev_node := null, min_node := null, max_node := null
- found_one := False
- 对于根中中序遍历的每个节点,进行以下操作
- 如果 prev_node 不为空,则
- 如果 node 的值小于 prev_node 的值,则
- 如果 min_node 为空或者 node 的值小于 min_node 的值,则
- min_node := node
- 如果 max_node 为空或者 max_node 的值小于 prev_node 的值,则
- max_node := prev_node
- 如果 found_one 为真,则
- 退出循环
- 否则,
- found_one := True
- prev_node := node
- 如果 prev_node 不为空,则
- 交换 min_node 和 max_node 的值
- 返回根
让我们看看下面的实现,以更好地理解
示例
class TreeNode:
def __init__(self, data, left = None, right = None):
self.val = data
self.left = left
self.right = right
def print_tree(root):
if root is not None:
print_tree(root.left)
print(root.val, end = ', ')
print_tree(root.right)
def __iter__(self):
if self.left:
for node in self.left:
yield node
yield self
if self.right:
for node in self.right:
yield node
setattr(TreeNode, "__iter__", __iter__)
class Solution:
def solve(self, root):
prev_node = None
min_node = None
max_node = None
found_one = False
for node in root:
if prev_node:
if node.val < prev_node.val:
if min_node is None or node.val < min_node.val:
min_node = node
if max_node is None or max_node.val < prev_node.val:
max_node = prev_node
if found_one:
break
else:
found_one = True
prev_node = node
min_node.val, max_node.val = max_node.val, min_node.val
return root
ob = Solution()
root = TreeNode(3)
root.left = TreeNode(6)
root.right = TreeNode(8)
root.right.left = TreeNode(2)
root.right.right = TreeNode(9)
print_tree(ob.solve(root))
输入
root = TreeNode(3)
root.left = TreeNode(6)
root.right = TreeNode(8)
root.right.left = TreeNode(2)
root.right.right = TreeNode(9)
输出
2, 3, 6, 8, 9,