1

题目地址:
https://leetcode-cn.com/probl...
题目描述:

给定一个二叉搜索树,编写一个函数 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个数。不过这样似乎有些浪费空间。
因此优化的方法是,可以在中序遍历的时候记录每次遍历到第几个节点。
如果该节点正是第k个节点,那么记录。并且停止之后所有的遍历。

java ac代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    //记录答案
    int ans;
    //表示当前节点的位置
    int pos;
    public int kthSmallest(TreeNode root, int k) {
     
        dfs(root,k);
        return ans;
    }
    
    void dfs(TreeNode root,int k)
    {
        if(root == null)return;
        dfs(root.left,k);
        
        //这个剪枝,否则仍是遍历每一个节点。
        //pos等于k表示已经求出了第k个节点。
        if(pos == k)return;
        
        pos++;
        if(pos == k)
        {
            ans = root.val;
            return;
        }
        dfs(root.right,k);
    }
}


Linus脱袜子
183 声望63 粉丝

硕士研究生在读。