zoukankan      html  css  js  c++  java
  • LeetCode-235-二叉搜索树的最近公共祖先

    二叉搜索树的最近公共祖先

    题目描述:给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

    百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

    示例说明请见LeetCode官网。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-search-tree/
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    解法一:递归法
    • 首先,如果p或q是根节点,直接返回根节点。
    • 如果p和q都不是根节点,则分以下几种情况处理:
      • 如果p和q的值都小于root的值,则递归调用该方法lowestCommonAncestor,入参为 root.left
      • 如果p和q的值都小于root的值,则递归调用该方法lowestCommonAncestor,入参为 root.right
      • 如果p和q一个大于root的值,另一个小于root的值,则p和q的最近公共祖先只可能是root,所以直接返回root。
    public class LeetCode_235 {
        /**
         * 递归法
         *
         * @param root
         * @param p
         * @param q
         * @return
         */
        public static TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
            // 如果p或q是根节点,直接返回根节点
            if (p == root) {
                return p;
            }
            if (q == root) {
                return q;
            }
            if (p.val < root.val && q.val < root.val) {
                // 如果p和q的值都小于root的值,则递归调用该方法,入参为 root.left
                return lowestCommonAncestor(root.left, p, q);
            } else if (p.val > root.val && q.val > root.val) {
                // 如果p和q的值都大于root的值,则递归调用该方法,入参为 root.right
                return lowestCommonAncestor(root.right, p, q);
            } else {
                // 如果p和q一个大于root的值,另一个小于root的值,则p和q的最近公共祖先只可能是root,所以直接返回root
                return root;
            }
        }
    
        public static void main(String[] args) {
            // 初始化一颗二叉搜索树
            TreeNode root = new TreeNode(6);
            TreeNode node_2 = new TreeNode(2);
            TreeNode node_8 = new TreeNode(8);
            root.left = node_2;
            root.right = node_8;
            root.left.left = new TreeNode(0);
            root.left.right = new TreeNode(4);
            root.left.right.left = new TreeNode(3);
            root.left.right.right = new TreeNode(5);
            root.right.left = new TreeNode(7);
            root.right.right = new TreeNode(9);
    
            // 调用方法,返回结果
            TreeNode result = lowestCommonAncestor(root, node_2, node_8);
            System.out.println(result.val);
        }
    }
    

    【每日寄语】 不是境况造就人,而是人造就境况。

  • 相关阅读:
    Mysql一分钟定位 Next-Key Lock,你需要几分钟
    golang 服务大量 CLOSE_WAIT 故障排查
    Mysql大并发热点行更新的两个骚操作
    golang 服务诡异499、504网络故障排查
    golang 服务平滑重启小结
    vim 列编辑模式
    特邀全球互联网技术大会(麒麟会GITC)分享 —大型团购系统架构设计
    ElasticSearch 评分排序
    zookeeper 实现分布式锁安全用法
    诡异的druid链接池链接断开故障经验总结
  • 原文地址:https://www.cnblogs.com/kaesar/p/15204358.html
Copyright © 2011-2022 走看看