leetcode 230. 二叉搜索树中第K小的元素

给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。

说明:
你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。

示例 1:

输入: root = [3,1,4,null,2], k = 1
   3
  / \
 1   4
  \
   2
输出: 1

示例 2:

输入: root = [5,3,6,2,4,null,null,1], k = 3
       5
      / \
     3   6
    / \
   2   4
  /
 1
输出: 3

进阶:
如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化 kthSmallest 函数?

思路

一开始的思路是将这颗二叉树按照中序遍历的顺序存在一个List里,然后直接取索引为k-1的值。
后来想想,我只是需要第k小的值,为什么需要存储所有的值呢,这不浪费空间吗?于是我设置一个一个变量cnt来记录中序遍历已经访问了的元素个数。访问到第k个的时候输出,代码如下。

class Solution {

    int cnt=0;
    int value;
    
    public int kthSmallest(TreeNode root, int k) {
        midTravel(root,k);
        return value;
    }

    void midTravel(TreeNode root,int k){
        if(root!=null&&cnt<k){
            midTravel(root.left,k);
            cnt++;
            if(cnt==k){value=root.val;return;}
            midTravel(root.right,k);
        }
    }
}
posted @ 2020-01-19 16:28  开局一把刀  阅读(3)  评论(0)    收藏  举报