Pythonを使用して、特定のノードのバイナリツリーの最も低い共通の祖先を見つけるプログラム
バイナリツリーが与えられ、ツリー内のすべてのノードの最も低い共通の祖先を見つけるように求められたとします。バイナリツリーの最も低い共通の祖先は、ノードx1、x2、x3、....、xnが子孫である最も低いノードです。特定のノードは、それ自体の子孫になることもできます。ノードを見つけて出力として返す必要があります。入力は、ツリーのルートノードと、祖先を見つける必要があるノードのリストです。
したがって、入力が次のような場合
祖先を見つける必要があるノードのリストは[6、8]です。その場合、出力は7になります。
ノード6と8が子孫である最下位ノードが7であるため、出力は7です。
これを解決するには、次の手順に従います-
-
関数fn()を定義します。これはノードを取ります
-
ノードがnullに類似している場合、
-
リターンノード
-
-
それ以外の場合、ノードがノードに事前設定されている場合、
-
リターンノード
-
-
left:=fn(ノードの左側)、
-
right:=fn(ノードの右側)
-
左右がnullでない場合、
-
リターンノード
-
-
それ以外の場合
-
左または右がnullでない場合、
-
リターンノード
-
-
-
-
ノード:=新しいリスト
-
node_listの各要素について、次のようにします
-
ノードの最後にsearch_node(root、elem)を挿入します
-
-
ノード:=ノードからの新しいセット
-
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
-
Pythonのバイナリツリーの最も低い共通の祖先
二分木があるとします。与えられた2つのノードの中で最も低い共通の祖先ノードを見つける必要があります。 2つのノードpとqのLCAは、実際には、pとqの両方を子孫として持つツリーの最下位ノードです。したがって、二分木が[3,5,1,6,2,0,8、null、null、7,4]のような場合。ツリーは次のようになります- ここで、5と1のLCAは3です これを解決するには、次の手順に従います- ツリーが空の場合は、nullを返します pとqの両方がrootと同じ場合は、rootを返します left:=pとqを使用したルートの左側のサブツリーのLCA right:=pとqを使用したル
-
Pythonのバイナリ検索ツリーの最も低い共通の祖先
二分探索木があるとします。与えられた2つのノードの中で最も低い共通の祖先ノードを見つける必要があります。 2つのノードpとqのLCAは、実際には、pとqの両方を子孫として持つツリーの最下位ノードです。したがって、二分木が[6、2、8、0、4、7、9、null、null、3、5]のような場合。ツリーは次のようになります- ここで、2と8のLCAは6です これを解決するには、次の手順に従います- ツリーが空の場合は、nullを返します pとqの両方がrootと同じ場合は、rootを返します left:=pとqを使用したルートの左側のサブツリーのLCA right:=pとqを使用し