刷题专栏(十三):二叉搜索树的最近公共祖先

简介: 刷题专栏(十三):二叉搜索树的最近公共祖先

前言

刷题专栏到目前已经是第十三篇了,欢迎大家来关注我的刷题专栏,一起来刷题。

对了,依然是二叉树;这个数据结构真实博大精深。

可惜二叉树在日常增删改查编程中很少使用到,不然也不用这样单独刷二叉树的题目。

今天的这道《二叉树搜索树的最近公共祖先》一题,难度定义为简单,只要你对二叉树有基本的理解就可以解题成功。

一起来看看吧。

image.png

算法题:二叉搜索树的最近公共祖先

这道题目给出了三个初始的二叉树,是要让我们通过三个二叉树来得到一个结果。

第一个二叉树是总的树,暂时叫二叉搜索树。

第二个、第三个是条件树。

要根据两个条件树来获得二叉搜索树的一个节点。

虽然一般二叉树的处理使用递归即可,但是这次好像不是很行。

使用遍历的时候也要注意,是使用一次遍历还是两次遍历。

因为有两个条件树,这是一定要考虑在内的。

还是直接看代码吧。

代码逻辑展示

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        TreeNode ancestor = root;
        while (true) {
            if (p.val < ancestor.val && q.val < ancestor.val) {
                ancestor = ancestor.left;
            } else if (p.val > ancestor.val && q.val > ancestor.val) {
                ancestor = ancestor.right;
            } else {
                break;
            }
        }
        return ancestor;
    }
}

代码执行结果

今天的这个结果,不是很满意,如果大家有什么更好方式能减少内存的消耗,评论区告诉我了。

image.png

总结

今天的这道题,主要是针对二叉树的一个反向逻辑,先找到一个值,然后找到这个值的前面的值。

所以除了要对二叉树数据结构有所了解,还要将这个逻辑搞清才行。

目录
相关文章
【五一专栏】1. 迭代版二叉树的前、中、后序遍历
【五一专栏】1. 迭代版二叉树的前、中、后序遍历
|
3月前
|
存储 算法
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
文章深入探讨了二叉树的层序遍历方法,并展示了如何通过队列实现层序遍历的算法逻辑,同时指出掌握层序遍历技巧可以帮助解决LeetCode上的多道相关题目。
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
|
6月前
|
存储 算法
刷题专栏(十一):二叉树的后序遍历
刷题专栏(十一):二叉树的后序遍历
57 0
|
6月前
|
算法
刷题专栏(六):二叉树的最大深度
刷题专栏(六):二叉树的最大深度
55 0
|
6月前
|
算法
刷题专栏(十):二叉树的前序遍历
刷题专栏(十):二叉树的前序遍历
55 0
|
6月前
|
存储 算法 C++
六六力扣刷题二叉树之基础
六六力扣刷题二叉树之基础
81 0
|
算法
牛客网《剑指offer》专栏刷题练习之二叉树合集
牛客网《剑指offer》专栏刷题练习之二叉树合集
90 1
|
存储 C++
二叉树题目合集
二叉树题目合集
51 0
|
Cloud Native
【刷题日记】590. N 叉树的后序遍历
本次刷题日记的第 5 篇,力扣题为:【刷题日记】590. N 叉树的后序遍历 ,简单
|
Cloud Native
【刷题日记】589. N 叉树的前序遍历
本次刷题日记的第 4 篇,力扣题为:589. N 叉树的前序遍历 ,简单