leetcode 236.バイナリツリーの最も低い共通の祖先(python)

オファーが届きました。友達を掘って受け取りましょう!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…

あなたのサポートは私の最大の動機です

おすすめ

転載: juejin.im/post/7079596238277967909