オファーが届きました。友達を掘って受け取りましょう!2022年春の採用チェックインイベントに参加しています。クリックしてイベントの詳細を表示してください
説明
バイナリツリーが与えられた場合、ツリー内の2つの与えられたノードの最も低い共通祖先(LCA)を見つけます。ウィキペディアのLCAの定義によると、「最も低い共通の祖先は、2つのノードpとqの間で、pとqの両方を子孫として持つTの最も低いノードとして定義されます(ノードをそれ自体の子孫にすることができます)。 」
例1:
Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
Output: 3
Explanation: The LCA of nodes 5 and 1 is 3.
复制代码
例2:
Input: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
Output: 5
Explanation: The LCA of nodes 5 and 4 is 5, since a node can be a descendant of itself according to the LCA definition.
复制代码
例3:
Input: root = [1,2], p = 1, q = 2
Output: 1
复制代码
ノート:
The number of nodes in the tree is in the range [2, 10^5].
-10^9 <= Node.val <= 10^9
All Node.val are unique.
p != q
p and q will exist in the tree.
复制代码
解析
質問の意味に従って、二分木が与えられた場合、ツリー内の2つの与えられたノードの最も低い共通祖先(LCA)を見つけます。ウィキペディアLCAの定義によると、最も低い共通の祖先は、2つのノードpとqの間の最も低いノード、つまり、pとqの両方を子孫として持つTのノードとして定義されます(ノードを独自の子孫にすることができます)。いくつかの例を読んだ後、LCAの意味を理解する必要があります。この問題の最も簡単な解決策は、ルートノードからpへのパスとルートノードからqへのパスを激しく見つけてから、分岐したノード(LCA)を見つけることですが、この解決策の時間計算量はpを見つけることにあります。またはq、時間計算量はO(n)です。正常に渡すことはできますが、2つのパスがあるため、空間計算量はO(logn)になります。
答え
class TreeNode(object):
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution(object):
def lowestCommonAncestor(self, root, p, q):
"""
:type root: TreeNode
:type p: TreeNode
:type q: TreeNode
:rtype: TreeNode
"""
result = []
def dfs(root, path, target):
if not root:
return
if root.val == target.val:
path.append(root.val)
result.append(path)
if root.left:
dfs(root.left, path+[root.val], target)
if root.right:
dfs(root.right, path+[root.val], target)
dfs(root, [], p)
dfs(root, [], q)
p_path = result[0]
q_path = result[1]
idx = 0
while idx < min(len(p_path), len(q_path)):
if p_path[idx] != q_path[idx]:
return TreeNode(p_path[idx-1])
idx += 1
return TreeNode(p_path[idx-1])
复制代码
運転結果
Runtime: 2456 ms, faster than 5.01% of Python online submissions for Lowest Common Ancestor of a Binary Tree.
Memory Usage: 418.2 MB, less than 5.06% of Python online submissions for Lowest Common Ancestor of a Binary Tree.
复制代码
解析
さらに、dfsは、サブツリーに含まれるpまたはqの数として定義できます。pまたはqが含まれていない場合は、0を返し、pまたはqのいずれか1つだけが含まれている場合は、1を返し、両方が含まれている場合は1を返します。含まれている、2を返します。これは上から下に再帰的であり、結果は下から上に返されるため、dfsが初めて2を返すノードに遭遇したときは、LCAである必要があります。
答え
class TreeNode(object):
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution(object):
def __init__(self):
self.result = None
def lowestCommonAncestor(self, root, p, q):
"""
:type root: TreeNode
:type p: TreeNode
:type q: TreeNode
:rtype: TreeNode
"""
def dfs(root, p, q):
if not root: return 0
left = dfs(root.left, p, q)
right = dfs(root.right, p, q)
self_ = 1 if (p == root or q == root) else 0
count = left + right + self_
if count == 2 and not self.result:
self.result = root
return count
dfs(root, p, q)
return self.result
复制代码
運転結果
Runtime: 68 ms, faster than 63.65% of Python online submissions for Lowest Common Ancestor of a Binary Tree.
Memory Usage: 29.9 MB, less than 8.97% of Python online submissions for Lowest Common Ancestor of a Binary Tree.
复制代码
元のタイトルリンク:leetcode.com/problems/lo…
あなたのサポートは私の最大の動機です