剑指Offer 54 - 二叉搜索树的第K大节点

Posted xintangchn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer 54 - 二叉搜索树的第K大节点相关的知识,希望对你有一定的参考价值。

力扣链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/

题目描述

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

 

思路:中序遍历变体

按右->root->左的顺序遍历,并计数K

代码:

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number} k
 * @return {number}
 */
var kthLargest = function(root, k) {

    let res;
    Inorder(root);
    return res;
    
    function Inorder(root){
        if(!root)   return;
        
        //中序遍历右节点,若遍历后k为0,说明已经找到第k大的数,提前返回。
        Inorder(root.right);
        if(k === 0) return;
       
        //处理当前节点,若k-1=0,说明当前节点为第K大的节点,存下结果并返回。
       if(--k === 0){
           res = root.val;
           return;
       }
        
        //中序遍历左节点
        Inorder(root.left);
        
    }
    
};

 

迭代法:

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number} k
 * @return {number}
 */
var kthLargest = function(root, k) {
    const stack = [];
    let count = 0;
    while(root || stack.length){
        while(root){
            stack.push(root);
            root = root.right;
        }
        
        const cur = stack.pop();
        if(++count === k){
            return cur.val;
        }
        
        root = cur.left;
    }
};

 

时间复杂度:O(N),当需要找最小的树时要遍历所有节点;当二叉搜索树是一个链表时相当于在数组中线性搜索

空间复杂度:O(N),最坏情况需要O(N)的栈空间

 

以上是关于剑指Offer 54 - 二叉搜索树的第K大节点的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer 54 二叉搜索树的第k大节点

LeetCode Java刷题笔记—剑指 Offer 54. 二叉搜索树的第k大节点

剑指Offer 54 - 二叉搜索树的第K大节点

剑指 Offer 54. 二叉搜索树的第k大节点

每日一题 - 剑指 Offer 54. 二叉搜索树的第k大节点

[LeetCode]剑指 Offer 54. 二叉搜索树的第k大节点