zoukankan      html  css  js  c++  java
  • [leetCode]235. 二叉搜索树的最近公共祖先

    题目

    https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-search-tree/

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

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

    例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]
    在这里插入图片描述

    
    示例 1:
    
    输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
    输出: 6 
    解释: 节点 2 和节点 8 的最近公共祖先是 6。
    示例 2:
    
    输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
    输出: 2
    解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。
     
    
    说明:
    
    所有节点的值都是唯一的。
    p、q 为不同节点且均存在于给定的二叉搜索树中。
    

    递归

    思路:
    由于二叉搜索树是有序的,所以只要当前节点的值在pq节点之间则当前节点就是pq的公共节点

    class Solution {
        public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
            // 由于 pq一定存在于给定的二叉树的二叉树中,所以一定能找到公共祖先,所以可以省略
            if (root == null) {
                return null;
            }
            if (root.val > p.val && root.val > q.val) {
                TreeNode left = lowestCommonAncestor(root.left, p, q);
                if (left != null) return left;
            }
                
            else if (root.val < p.val && root.val < q.val) {
                TreeNode right = lowestCommonAncestor(root.right, p, q);
                if (right != null) return right;
            }
            return root;
        }
    }
    

    递归精简版

    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);
            else if (root.val < p.val && root.val < q.val) 
                return lowestCommonAncestor(root.right, p, q);
            return root;
        }
    }
    

    迭代法

    class Solution {
        public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
           while (root != null) {
               if (root.val > p.val && root.val > q.val) {
                   root = root.left;
               } else if (root.val < p.val && root.val < q.val) {
                   root = root.right;
               } else {
                   return root;
               }
           }
           return null;
        }
    }
    
  • 相关阅读:
    还能这样偷懒?用Python实现网站自动签到脚本
    普通爬虫 VS 多线程爬虫!Python爬虫运行时间对比
    中文文献阅读方法及笔记模板
    约束
    可迭代对象补充
    练习题及补充
    内置函数的补充/super/异常值处理
    特殊成员
    嵌套
    面向对象知识点总结补充
  • 原文地址:https://www.cnblogs.com/PythonFCG/p/13926321.html
Copyright © 2011-2022 走看看