Tencent 40-Binary Treeの最も近い公の祖先

Tencent 40-二分木leetcode236の最も近い公の祖先

バイナリツリーを指定して、ツリー内の指定された2つのノードの最も近い共通の祖先を見つけます。

Baidu Encyclopediaの最新の公開祖先の定義は次のとおりです。「ルート化ツリーTの2つのノードpおよびqの場合、最新の公開祖先はノードxとして表され、xはpおよびqの祖先であり、xの深さは可能な限り大きい(ノードはそれ自身の祖先になることもできます)。 "

たとえば、次のバイナリツリーがあるとします。root = [3,5,1,6,2,0,8、null、null、7,4]
ここに画像の説明を挿入
例1:

入力:root = [3,5,1,6,2,0,8、null、null、7,4]、p = 5、q = 1
出力:3
説明:ノード5とノード1の最も近い共通の祖先はノード3。
例2:

入力:root = [3,5,1,6,2,0,8、null、null、7,4]、p = 5、q = 4
出力:5
説明:ノード5とノード4の最も近い共通の祖先はノード5。定義により、最も近い共通の祖先ノードがノード自体になる可能性があるためです。

説明:

すべてのノードの値は一意です。
pとqは異なるノードであり、すべて指定されたバイナリツリーに存在します。

  • 2進数bstを検索するわけではないので、サイズ比較方法は使用できません。
  • サイズを比較する方法ではなく、ノード自体を比較する方法です。
  • 方法:左のノードにpとqのいずれかがあり、右のノードにpとqのいずれかがある場合、ルートノードが望ましいノードです。
  • そうでない場合、左側のノードにp、qがなく、右側のノードにp、qのいずれかがある場合、右側のノードが望ましいです。
  • 同様に、右のノードがp、qのいずれにも存在せず、左のノードがp、qのいずれかに存在する場合、左のノードが望ましいです。
  • 停止条件、ルートはp、qのいずれか、直接ルートノードに戻る、ルートノードは空、空を返す

6行のコード

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        ##不是搜索二叉数bst,所以不能用比较大小的方式,
        ##用的不是比较大小的方式,而是比较结点本身的方式,
        ##方法:如果左结点存在p,q中的任一个,右结点存在p,q中的任一个,根结点即为所求
        ##否则,如果左结点不存在p,q中的任一个,而右结点存在p,q中的任一个,右结点即为所求,
        ##对应着,如果右结点不存在p,q中的任一个,而左结点存在p,q中的任一个,左结点即为所求,
        ##停止条件,root为p,q中的任一个,直接返回根结点,根结点为空,返回空
        if root is  None:return None
        if root==p or root==q:
            return root
        else:
            left_res=self.lowestCommonAncestor(root.left, p, q)
            right_res=self.lowestCommonAncestor(root.right, p, q)
            if left_res is not None and right_res is not None:
                return root
            else:
                return left_res if right_res is  None else right_res
93件の元の記事を公開 賞賛8 10,000以上のビュー

おすすめ

転載: blog.csdn.net/zlb872551601/article/details/103650959