Python程式:將近似BST轉換為精確BST
假設我們有一棵二叉樹,它幾乎是一棵二叉搜尋樹。只有兩個節點的值被交換了。我們必須糾正它並返回二叉搜尋樹。
因此,如果輸入是這樣的:
那麼輸出將是:
為了解決這個問題,我們將遵循以下步驟:
- prev_node := null,min_node := null,max_node := null
- found_one := False
- 對於根節點的中序遍歷中的每個節點,執行:
- 如果prev_node不為空,則:
- 如果節點的值 < prev_node的值,則:
- 如果min_node為空或節點的值 < min_node的值,則:
- min_node := 節點
- 如果max_node為空或max_node的值 < prev_node的值,則:
- max_node := prev_node
- 如果found_one為true,則:
- 退出迴圈
- 否則:
- found_one := True
- 如果min_node為空或節點的值 < min_node的值,則:
- prev_node := 節點
- 如果節點的值 < prev_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,
廣告