私は、トップダウン再帰を使用してバイナリツリーの問題最小共通共通祖先(LCA)の問題を解決しようとしています。再帰を使用してバイナリツリーで最も低い共通祖先
私が使用しているアプローチである:
IDEA:他の所望のノードが反対のサブツリーであるいずれかのサブツリー内の所望のノードのうちの1つを有するノードを探します。
PSEUDOCODE 1. If the value of root is equal to either of the desired node's value, the root is the LCA. 2. Search in the left subtree for either node. 3. Search in the right subtree for either node. 4. If neither of them contains any of the two nodes, the nodes do not exist in the tree rooted at the root node. 5. If each of them contains one node, the root is the LCA. 6. If either one of them contains a node, return it to the root.
また、これはStackOverflowの上related questionsの答えで推奨されているものです。
このコードは、ツリーのすべてのノードが一意の値であると仮定するとうまくいきます。つまり、このアプローチは重複の場合には破損しているようです
重複した値でも動作するようにコードを修正するにはどうすればいいですか?この方法で最適な解決策が得られない場合は、どのように私のアプローチを変更する必要がありますか?ここ
は、正確な実装である:例えば
class TreeNode(object):
def __init__(self, x):
self.val = x
self.left = None
self.right = None
def __repr__(self):
return 'TreeNode({}, {}, {})'.format(self.val, self.left, self.right)
def lowestCommonAncestor(root, p, q):
"""
:type root: TreeNode
:type p: TreeNode
:type q: TreeNode
:rtype: TreeNode
"""
if root is None:
return None
if p.val == root.val or q.val == root.val:
return root
left_subtree = lowestCommonAncestor(root.left, p, q)
right_subtree = lowestCommonAncestor(root.right, p, q)
if left_subtree is None and right_subtree is None:
return None
if left_subtree is not None and right_subtree is not None:
return root
if left_subtree is None:
return right_subtree
else:
return left_subtree
:
root = TreeNode(2)
root.left = TreeNode(3)
root.left.left = TreeNode(1)
root.right = TreeNode(5)
root.right.left = TreeNode(7)
root.right.right = TreeNode(1)
print(lowestCommonAncestor(root, TreeNode(1), TreeNode(7)))
これは結果として、ツリーのルートを返します。 result = TreeNode(2)
疑いもなく、ルートは常に祖先です。
しかし、根よりも "下位の"共通祖先が存在します - TreeNode(5)
。
「__eq__」と関連比較マジックメソッドでどのようなロジックを実装する必要がありますか。 また、この場合、変更できないオンラインジャッジからデータ構造を使用しています。 –