力扣(LeetCode)230

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

给定一个二叉搜索树,编写一个函数 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个节点,那么记录。而且中止以后全部的遍历。node

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);
    }
}
相关文章
相关标签/搜索