Description
面试题54. 二叉搜索树的第k大节点
难度简单16
给定一棵二叉搜索树,请找出其中第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
限制:
1 ≤ k ≤ 二叉搜索树元素个数。
解答
利用二叉搜索树的中序遍历的思想。
中序遍历的思路是,先遍历左子树,打印root节点,再遍历右子树,遍历打印的结果是从小到大排序。
void inOrder(TreeNode node){if(node == null)return;inOrder(node.left);System.out.println(node.val);inOrder(node.right);}
而题目的要求是打印第 k 大的节点,我们可以修改下中序遍历让其从大到小遍历,遍历到第 k 大节点时输出。
改进后的中序遍历。只需要调整遍历的顺序,改为先遍历右子树,打印 root 节点,遍历左子树,此时遍历打印的结果就是从大到小的排序。
void inOrder(TreeNode node){if(node == null)return;inOrder(node.right);System.out.println(node.val);inOrder(node.left);}
解答代码:
class Solution {int k;int result;public int kthLargest(TreeNode root, int k) {this.k = k;inOrder(root);return result;}// 修改public void inOrder(TreeNode node) {if(node == null)return ;inOrder(node.right);if(k == 0) return; // 提前结束遍历。if(--k == 0)result = node.val;inOrder(node.left);}}
执行结果:通过
执行用时 :0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗 :39.6 MB, 在所有 Java 提交中击败了100.00%的用户
