码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-07-03 23:28:17      阅读:69      评论:0      收藏:0      [点我收藏+]

标签:this   const   node   fun   number   结果   处理   tco   一个   

力扣链接: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大节点

标签:this   const   node   fun   number   结果   处理   tco   一个   

原文地址:https://www.cnblogs.com/xintangchn/p/13233026.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!