• 【LeetCode】230. Kth Smallest Element in a BST (2 solutions)


    Kth Smallest Element in a BST

    Given a binary search tree, write a function kthSmallest to find the kth smallest element in it.

    Note: 
    You may assume k is always valid, 1 ≤ k ≤ BST's total elements.

    Follow up:
    What if the BST is modified (insert/delete operations) often and you need to find the kth smallest frequently? How would you optimize the kthSmallest routine?

    Show Hint 

      Credits:
      Special thanks to @ts for adding this problem and creating all test cases.

      解法一:递归中序遍历,必须全部遍历

      /**
       * 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) {
              vector<int> ret;
              inOrder(root, ret);
              return ret[k-1];
          }
          void inOrder(TreeNode* root, vector<int>& ret)
          {
              if(root)
              {
                  inOrder(root->left, ret);
                  ret.push_back(root->val);
                  inOrder(root->right, ret);
              }
          }
      };

      解法二:迭代中序遍历,遍历到第k个元素停止

      /**
       * 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) {
              vector<int> ret;
              stack<TreeNode*> stk;
              stk.push(root);
              TreeNode* cur = root;
              while(cur->left)
              {
                  stk.push(cur->left);
                  cur = cur->left;
              }
              while(!stk.empty())
              {
                  TreeNode* top = stk.top();
                  stk.pop();
                  ret.push_back(top->val);
                  if(ret.size() == k)
                      break;
                  if(top->right)
                  {
                      TreeNode* cur = top->right;
                      stk.push(cur);
                      while(cur->left)
                      {
                          stk.push(cur->left);
                          cur = cur->left;
                      }
                  }
              }
              return ret[k-1];
          }
      };

    1. 相关阅读:
      Session机制详解
      JDK各个版本比较 JDK5~JDK9
      CAS 自旋锁
      OAuth2.0认证和授权原理
      微信二维码登录原理
      Django Restframework 实践(一)
      ESXI 5.5卡在LSI_MR3.V00
      理解RESTful架构
      RESTful API 设计指南
      python 异步 select pooll epoll
    2. 原文地址:https://www.cnblogs.com/ganganloveu/p/4629516.html
    Copyright © 2020-2023  润新知