[二叉树] 二叉树的最近公共祖先--leetcode236
生活随笔
收集整理的這篇文章主要介紹了
[二叉树] 二叉树的最近公共祖先--leetcode236
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
給定一個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。
百度百科中最近公共祖先的定義為:“對于有根樹 T 的兩個節點 p、q,最近公共祖先表示為一個節點 x,滿足 x 是 p、q 的祖先且 x 的深度盡可能大(一個節點也可以是它自己的祖先)。”
?
?
解題思路:
祖先的定義: 若節點 pp 在節點 rootroot 的左(右)子樹中,或 p = rootp=root ,則稱 rootroot 是 pp 的祖先。
最近公共祖先的定義: 設節點 root為節點 p, q的某公共祖先,若其左子節點 root.left和右子節點 root.right都不是 p,q的公共祖先,則稱 root?是 “最近的公共祖先” 。
根據以上定義,若 root是 p, q的最近公共祖先 ,則只可能為以下情況之一:
考慮通過遞歸對二叉樹進行后序遍歷,當遇到節點 p?或 q 時返回。從底至頂回溯,當節點 p, q 在節點 root? 的異側時,節點 root 即為最近公共祖先,則向上返回 root
遞歸解析:
?
終止條件:
遞推工作:
返回值: 根據 left 和 right ,可展開為四種情況;
p,q兩節點都在 root 的 右子樹 中,此時的 right?指向最近公共祖先節點 ;
?
?
# Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = Noneclass Solution:def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':if not root or root == p or root == q:return rootelse:left = self.lowestCommonAncestor(root.left, p, q)right = self.lowestCommonAncestor(root.right, p, q)if left and right: #一個在左子樹,一個在右子樹return rootelif left:#都在左子樹return leftelif right:#都在右子樹return rightelse:return?
總結
以上是生活随笔為你收集整理的[二叉树] 二叉树的最近公共祖先--leetcode236的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [二叉树]二叉树中和为某一值的路径 (剑
- 下一篇: 《剑指offer》题目说明