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