Skip to content
本页目录

54-二叉搜索树的第k大节点

题目描述

https://leetcode.cn/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/ 给定一棵二叉搜索树,请找出其中第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 ≤ 二叉搜索树元素个数

思路分析

基本思路 : 二叉搜索树,所有左边的值都小于右边的值 题目要求第 k 大的值, 从大到小 遍历顺序应该是 : 右根左 最简单的方法,就是遍历,增加到数组中去,最后取出第k个元素,此方法需要开辟一个新的空间 另外的方法是 设置外部变量累加器 count ,当 count == k 的时候,该元素即为 第 k 大的元素

实现代码

csharp
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left;
 *     public TreeNode right;
 *     public TreeNode(int x) { val = x; }
 * }
 */
public class Solution {

    int count = 0;
    int answer = 0;

    private void dfs(TreeNode cur, int k){
        // 右根左
        if(cur.right != null){
            dfs(cur.right, k);
        }
        count++;
        if(count == k){
            answer = cur.val;
            return;
        }
        if(cur.left != null){
            dfs(cur.left, k);
        }
    }

    public int KthLargest(TreeNode root, int k) {
        if(root == null){
            return -1;
        }
        dfs(root,k);
        return answer;
    }
}

实现代码2

csharp
public class Solution {
    int count = 0;
    int answer = 0;
    private void dfs(TreeNode cur, int k){
        if(cur == null){
            return;
        }
        dfs(cur.right);
        count++;
        if(count == k){
            answer = cur.val;
            return;
        }
        dfs(cur.left);
    }

    public int KthLargest(TreeNode root, int k) {
        if(root == null){
            return -1;
        }
        dfs(root,k);
        return answer;
    }
}

Released under the MIT License.