[路飞]_leetcode刷题_二叉搜索树的第k大节点

164 阅读2分钟

题目

二叉搜索树的第k大节点

给定一棵二叉搜索树,请找出其中第k大的节点。

示例 1:

输入: root = [3,1,4,null,2], k = 1
   3
  / \
 1   4
  \
   2
输出: 4

示例 2:

输入: root = [5,3,6,2,4,null,null,1], k = 3
       5
      / \
     3   6
    / \
   2   4
  /
 1
输出: 4

思路:

首先要明白二叉搜索树的定义。

二叉搜索树 (Binary Search Tree),(又:二叉查找树,二叉排序树)它或者是一棵空树,或者是具有下列性质的 二叉树 : 若它的左子树不空,则左子树上所有结点的值均小于它的 根结点 的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为 二叉排序树 。. 二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势;所以应用十分广泛,例如在文件系统和数据库系统一般会采用这种数据结构进行高效率的排序与检索操作。

那么我们整理上从右往左去遍历,即右中左,就可从最大的元素往下开始找,找到第k个元素即可

二叉树的中序遍历是左中右,那右中左起始就是二叉树的中序遍历的倒序

代码逻辑:

  1. 申明一个全局计数器,从k开始倒数,到0即结束。
  2. 中序的倒序遍历二叉树,如果节点为null则返回,如果k == 0也返回
  3. 先遍历右节点
  4. 遍历完之后,k--,再判断k是否为0,为0则返回当前的root
  5. 继续遍历左节点 ... 以此类推

代码如下:

/**
 * @param {TreeNode} root
 * @param {number} k
 * @return {number}
 */
var kthLargest = function(root, k) {
    res = 0,count = k;
    if(root == null || k == 0) return ;
    dfs(root)
    return res
};

function dfs(root){
    if(root == null) return ;
    dfs(root.right);
    if(--count == 0){
        res = root.val;
        return ;
    }
    dfs(root.left);
}

代码里有用到全局变量,虽然不太好,但这样好理解一些,改成局部变量看起来会复杂一点