剑指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大节点的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode Java刷题笔记—剑指 Offer 54. 二叉搜索树的第k大节点