使用Python查詢給定節點二叉樹的最近公共祖先的程式
假設我們給定一個二叉樹,並要求找出樹中所有節點的最近公共祖先。二叉樹中的最近公共祖先是最底層的節點,節點x1、x2、x3……xn都是其後代。某個特定節點也可以是其自身的後代。我們必須找到該節點並將其作為輸出返回。輸入是樹的根節點以及我們必須找到其祖先的節點列表。
因此,如果輸入類似於
並且我們必須找到其祖先的節點列表為[6, 8];則輸出將為7。
輸出為7,因為節點6和8的最底層祖先節點是7。
為了解決這個問題,我們將遵循以下步驟:
定義一個函式fn()。這將接收節點作為引數
如果節點類似於空,則
返回節點
否則,當節點存在於nodes中時,則
返回節點
left := fn(節點的左子節點),
right := fn(節點的右子節點)
如果left和right都不為空,則
返回節點
否則,
如果left或right不為空,則
返回節點
nodes := 一個新的列表
對於node_list中的每個元素,執行
將search_node(root, elem)插入到nodes的末尾
nodes := 從nodes建立的新集合
返回fn(root)
讓我們看看下面的實現來更好地理解:
示例
import collections class TreeNode: def __init__(self, data, left = None, right = None): self.data = data self.left = left self.right = right def insert(temp,data): que = [] que.append(temp) while (len(que)): temp = que[0] que.pop(0) if (not temp.left): if data is not None: temp.left = TreeNode(data) else: temp.left = TreeNode(0) break else: que.append(temp.left) if (not temp.right): if data is not None: temp.right = TreeNode(data) else: temp.right = TreeNode(0) 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 == None): return None if (root.data == element): return root res1 = search_node(root.left, element) if res1: return res1 res2 = search_node(root.right, element) return res2 def print_tree(root): if root is not None: print_tree(root.left) print(root.data, end = ', ') print_tree(root.right) def solve(root, node_list): nodes = [] for elem in node_list: nodes.append(search_node(root, elem)) nodes = set(nodes) def fn(node): if not node: return node elif node in nodes: return node left, right = fn(node.left), fn(node.right) return node if left and right else left or right return fn(root) root = make_tree([5, 3, 7, 2, 4, 6, 8]) print(solve(root, [6,8]).data)
輸入
make_tree([5, 3, 7, 2, 4, 6, 8]), [6, 8]
輸出
7
廣告