博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Leetcode] Lowest Common Ancestor of a Binary Tree 最小公共祖先
阅读量:6677 次
发布时间:2019-06-25

本文共 2750 字,大约阅读时间需要 9 分钟。

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;    }}

转载地址:http://gggxo.baihongyu.com/

你可能感兴趣的文章
前端开发,最新技术栈总结
查看>>
敏捷开发的艺术---第一章
查看>>
jQUery事件
查看>>
测试及等等
查看>>
JAVACard 基本数据类型的运算及溢出问题
查看>>
通过Python来操作kylin
查看>>
代码逻辑题之继承-静态代码块-main方法执行顺序
查看>>
c# 判断文件是否发生了变化
查看>>
Remove menucool tooltip trial version
查看>>
node.js 签到
查看>>
SQL注入漏洞 详解
查看>>
输入框提示--------百度IFE前端task2
查看>>
实战p12文件转pem文件
查看>>
如何去掉数据库重复记录并且只保留一条记录
查看>>
ubuntu 无线上网不稳定
查看>>
模板 数据结构
查看>>
【Search a 2D Matrix】cpp
查看>>
POJ 1741 Tree(树的点分治,入门题)
查看>>
Opencv3.1.0 & Win10/Win7 64位 contrib编译
查看>>
MPMoviePlayerController播放远程视频存在问题
查看>>