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 函数?

代码(非递归)

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int kthSmallest(TreeNode* root, int k) {
       TreeNode* cur=root;
       stack<TreeNode*> st;
       int num = 0;
       while(!st.empty() || cur)
       {
           if(cur)
           {
               st.push(cur);
               cur = cur->left;
           }
           else{
               cur = st.top();
               st.pop();
               if(k == ++num)
                return cur->val;
               cur = cur->right;
           }
       }
       return -1;
    }
};

结果

执行用时:32 ms, 在所有 C++ 提交中击败了59.00%的用户
内存消耗:24.3 MB, 在所有 C++ 提交中击败了5.00%的用户

代码(递归)

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int kthSmallest(TreeNode* root, int k) {
       int ans,index = 0;
       inorder(root,index,k,ans);
       return ans;
    }
    void inorder(TreeNode* root,int& index,int k,int& ans)//中序遍历
    {
        if(!root)return;
        inorder(root->left,index,k,ans);
        if(++index == k)ans = root->val;
        //cout<<index<<"  "<<root->val<<endl;
        inorder(root->right,index,k,ans);
    }
};

结果

执行用时:24 ms, 在所有 C++ 提交中击败了90.75%的用户
内存消耗:24.2 MB, 在所有 C++ 提交中击败了5.00%的用户
posted @ 2020-06-20 14:55  曲径通霄  阅读(103)  评论(0编辑  收藏  举报