算法-第235题二叉搜索树的最近公共祖先

276 阅读2分钟

这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战

一、题目

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

二叉搜索树

在做这道题目之前,我们要先了解二叉搜索树,并且知道如何验证。

定义:二叉搜索树又叫二叉排序树,二叉搜索树是在二叉树的基础上加了一些限制。上图就是一个二叉搜索树,其中每个节点的值都大于left左子树所有的值,同时小于right右子树所有的值。

特点:

  1. 看上面这个图,左子树的所有节点都比根节点小,右子树的所有节点都比根节点大
  2. 是一种经典的数据结构,既有链表的快速插入删除的操作特点,又有数组快速查找的优势
  3. 一般用在文件管理系统和数据库系统里,可以实现高效率的排序和检索。

根据上面这个图,就可以使用中序遍历:先左子树节点再自己遍历最后右子树遍历,可以有序递增的实现。上图如果使用中序遍历的结果就是:2->6->7->8->9->10->13->15->17

二、使用大小判断

var lowestCommonAncestor = function(root, p, q) {    if(p.val > root.val && q.val > root.val) {
        return lowestCommonAncestor(root.right,p,q);
    }else if(p.val < root.val && q.val < root.val) {        return lowestCommonAncestor(root.left,p,q);    }else {
        return root
    }};

思路:

  1. 什么是公共祖先呢?就是一个比root大一个比root小
  2. 如果树节点的值位于p和q两个节点值中间或与某个节点相等,则该节点一定是两节点最近的父节点
  3. 否则如果树节点值大于两节点的值,则两节点都位于树节点的左子树,并把其右节点作为当前节点进行搜索
  4. 同理如果树节点的值小于两点的值,则两节点都位于树节点的右子树,并把其左节点作为当前节点进行搜索

三、递归方式实现

var lowestCommonAncestor = function(root,p,q) {
    while(root) {
        if(p.val > root.val && q.val > root.val) {
            root = root.right;
        }else if(p.val < root.val && q.val < root.val) {      
            root = root.left;
        }else {
            return root;
        }
    }
}     

思路:

  1. 使用递归写循环的方式实现,然后两个if的判断和上面比较大小的思路一样

好啦,这就是使用比较大小和使用递归循环的方式实现这道题二叉搜索树的最近公共祖先,其实这里还有个问题,就是如果不是二叉搜索树的情况下该怎么办,下一章再说哦~