สมมติว่าเรามีไบนารีทรีและเกือบจะเป็นทรีการค้นหาแบบไบนารี มีการสลับค่าของโหนดเพียงสองโหนดเท่านั้น เราต้องแก้ไขและส่งคืนแผนผังการค้นหาไบนารี
ดังนั้นหากอินพุตเป็นแบบ
แล้วผลลัพธ์ที่ได้จะเป็น
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- prev_node :=null, min_node :=null, max_node :=null
- found_one :=เท็จ
- สำหรับแต่ละโหนดในการข้ามผ่านของ root ให้ทำ
- ถ้า prev_node ไม่เป็นโมฆะ
- ถ้าค่าของโหนด <ค่าของ prev_node แล้ว
- ถ้า min_node เป็นโมฆะหรือค่าของโหนด <ค่าของ min_node แล้ว
- min_node :=โหนด
- ถ้า max_node เป็นโมฆะหรือค่าของ max_node <ค่าของ prev_node แล้ว
- max_node :=prev_node
- ถ้า found_one เป็นจริง
- ออกมาจากวงจร
- มิฉะนั้น
- found_one :=จริง
- ถ้า 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,