โจทย์: กำหนด leaf node ให้กลายเป็น root ใหม่ โดยกฎ: left child กลายเป็น right child, parent กลายเป็น left child (และ parent เก่าตัด link ไปยัง node นั้น) ใช้ recursion ย้อนกลับจาก leaf ไป root เดิม
อัลกอริทึม
- ฟังก์ชัน helper(node, new_parent) รับโหนดปัจจุบันและ parent ใหม่
- ถ้า node เป็น root เดิม: ตั้ง parent, ตัด link left/right ที่ชี้ไป new_parent, คืน root
- ถ้ามี left child: ย้าย left ไป right
- ตัด link parent เก่าที่ชี้มาหา node
- Recursive: node.left = helper(node.parent, node)
- ตั้ง node.parent = new_parent, คืน node
ตัวอย่างโค้ด
import collections
class TreeNode:
def __init__(self, data, left=None, right=None, parent=None):
self.data = data
self.left = left
self.right = right
self.parent = parent
def insert(temp, data):
que = [temp]
while que:
temp = que.pop(0)
if not temp.left:
temp.left = TreeNode(data, parent=temp) if data is not None else TreeNode(0, parent=temp)
break
else:
que.append(temp.left)
if not temp.right:
temp.right = TreeNode(data, parent=temp) if data is not None else TreeNode(0, parent=temp)
break
else:
que.append(temp.right)
def make_tree(elements):
Tree = TreeNode(elements[0])
for element in elements[1:]:
insert(Tree, element)
return Tree
def search_node(root, element):
if root is None: return None
if root.data == element: return root
res1 = search_node(root.left, element)
if res1: return res1
return search_node(root.right, element)
def solve(root, leaf):
def helper(node, new_par):
if node == root:
node.parent = new_par
if node.left == new_par: node.left = None
if node.right == new_par: node.right = None
return root
if node.left:
node.right = node.left
if node.parent.left == node:
node.parent.left = None
node.left = helper(node.parent, node)
node.parent = new_par
return node
return helper(leaf, None)
root = make_tree([5, 3, 7, 2, 4, 6, 8])
root = solve(root, search_node(root, 8))
def print_tree(root):
if root:
print_tree(root.left)
print(root.data, end=', ')
print_tree(root.right)
print_tree(root) # Output: 2, 3, 4, 5, 7, 6, 8,
อินพุต/เอาต์พุต
Input: root=make_tree([5,3,7,2,4,6,8]), leaf=8 Output (inorder): 2, 3, 4, 5, 7, 6, 8,