当前位置

网站首页> 程序设计 > 开源项目 > 程序开发 > 浏览文章

[Leetcode] Lowest Common Ancestor of a Binary Tree 最小公共祖先

作者:小梦 来源: 网络 时间: 2024-01-24 阅读:

Lowest Common Ancestor of a Binary Search Tree

Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST.

According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”

        _______6______       /  \    ___2__          ___8__   /      \        /      \   0      _4       7       9         /  \         3   5

For example, the lowest common ancestor (LCA) of nodes 2 and 8 is 6. Another example is LCA of nodes 2 and 4 is 2, since a node can be a descendant of itself according to the LCA definition.

二分法

复杂度

时间 O(h) 空间 O(h) 递归栈空间

思路

对于二叉搜索树,公共祖先的值一定大于等于较小的节点,小于等于较大的节点。换言之,在遍历树的时候,如果当前结点大于两个节点,则结果在当前结点的左子树里,如果当前结点小于两个节点,则结果在当前节点的右子树里。

代码

public class Solution {    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {        if(root.val > p.val && root.val > q.val) return lowestCommonAncestor(root.left, p, q);        if(root.val < p.val && root.val < q.val) return lowestCommonAncestor(root.right, p, q);        return root;    }}

Lowest Common Ancestor of a Binary Tree

Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree.

According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”

        _______3______       /  \    ___5__          ___1__   /      \        /      \   6      _2       0       8         /  \         7   4

For example, the lowest common ancestor (LCA) of nodes 5 and 1 is 3. Another example is LCA of nodes 5 and 4 is 5, since a node can be a descendant of itself according to the LCA definition.

深度优先标记

复杂度

时间 O(h) 空间 O(h) 递归栈空间

思路

我们可以用深度优先搜索,从叶子节点向上,标记子树中出现目标节点的情况。如果子树中有目标节点,标记为那个目标节点,如果没有,标记为null。显然,如果左子树、右子树都有标记,说明就已经找到最小公共祖先了。如果再跟节点为p的左右子树中找p、q的公共祖先,则必定是p本身。

代码

public class Solution {    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {        //发现目标节点则通过返回值标记该子树发现了某个目标结点        if(root == null || root == p || root == q) return root;        //查看左子树中是否有目标结点,没有为null        TreeNode left = lowestCommonAncestor(root.left, p, q);        //查看右子树是否有目标节点,没有为null        TreeNode right = lowestCommonAncestor(root.right, p, q);        //都不为空,说明做右子树都有目标结点,则公共祖先就是本身        if(left!=null&&right!=null) return root;        //如果发现了目标节点,则继续向上标记为该目标节点        return left == null ? right : left;    }}

热点阅读

网友最爱