zoukankan      html  css  js  c++  java
  • 【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. 相关阅读:
      【原创】2013个人年终总结
      【原创】关于部门月会(二)
      【原创】关于部门月会(一)
      [转载]使用RoboCopy 命令
      ubuntu 16.04.3 安装完成后的一些初始化工作
      umbraco v7.6.4 surface controller not found 大深坑!
      ubuntu 及 postgredql 安装配置小坑摘录
      flex hack 记录
      C# 中的委托和事件
      OVER(PARTITION BY)函数介绍
    2. 原文地址:https://www.cnblogs.com/ganganloveu/p/4629516.html
    Copyright © 2011-2022 走看看