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;
        }
    }
    
  • 相关阅读:
    yzm10铺瓷砖 yzm10原创系列
    如何统计博客园的个人博客访问量
    Hybrid设计--账号体系的建设
    Hybrid设计--核心交互
    Hybrid设计--H5和Native,收口
    MySQL数据类型--与MySQL零距离接触 3-2 外键约束的要求解析
    MySQL数据类型--与MySQL零距离接触2-14MySQL默认约束
    css3径向渐变
    MySQL数据类型--与MySQL零距离接触2-13MySQL唯一约束
    MySQL数据类型--与MySQL零距离接触2-12主键约束
  • 原文地址:https://www.cnblogs.com/PythonFCG/p/13926321.html
Copyright © 2011-2022 走看看