LeetCode236. 二叉树的最近公共祖先(后序遍历 DFS)
程序员文章站
2022-04-27 11:34:32
...
1、题目描述
https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/
相关题:68-1二叉搜索树的最近公共祖先(剑)LeetCode.235 https://blog.csdn.net/IOT_victor/article/details/104622587
2、代码详解
# Definition for a binary tree node.
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
"""
if not root or root == p or root == q:
return root
# 通过递归对二叉树进行 后序遍历,当遇到节点 p 或 q 时返回。
# 从底至顶回溯,当节点 p, q 在节点 root 的异侧时,节点 root 即为最近公共祖先,则向上返回 root 。
left = self.lowestCommonAncestor(root.left, p, q)
right = self.lowestCommonAncestor(root.right, p, q)
if not left and not right:
return # 1.说明 root 的左 / 右子树中都不包含 p,q,返回 null
if not left:
# 3.p,q 都不在 root 的左子树中,直接返回 right,具体可分为两种情况:
# p,q 其中一个在 root 的 右子树 中,此时 right 指向 p(假设为 p )
# p,q 两节点都在 root 的 右子树 中,此时的 right 指向 最近公共祖先节点
return right
if not right:
return left # 4.同理3
return root # 2. if left and right: 同时不为空 :说明 p, q 分列在 root 的 异侧 (分别在 左 / 右子树),因此 root 为最近公共祖先,返回 root
上一篇: Weekly Contest 98
推荐阅读
-
力扣OJ 剑指 Offer 68 - II. 236. 二叉树的最近公共祖先
-
372,二叉树的最近公共祖先
-
LeetCode236:二叉树的最近公共祖先
-
LeetCode68 二叉树的最近公共祖先
-
Leetcode 236. 二叉树的最近公共祖先
-
求二叉树中两个节点的最近公共祖先(三叉链,搜索树,普通二叉树)
-
判断一棵树是否是完全二叉树和求二叉树中两个节点的最近公共祖先——题集(十三)
-
在二叉树中找到两个节点的最近公共祖先
-
LeetCode 236 -- 二叉树的最近公共祖先 ( Lowest Common Ancestor of a Binary Tree ) ( C语言版 )
-
【Leetcode刷题篇】leetcode236 二叉树的最近公共祖先