• 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?

    Analyse:

    Trial 1: We can first sort the sequence by inorder traversal and find the k-th element.

        Runtime: 24ms

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     int kthSmallest(TreeNode* root, int k) {
    13         if(!root) return 0;
    14         vector<int> result;
    15         inorder(root, result);
    16         return result[k - 1];
    17     }
    18     void inorder(TreeNode* root, vector<int>& result){
    19         if(!root) return;
    20         inorder(root->left, result);
    21         result.push_back(root->val);
    22         inorder(root->right, result);
    23     }
    24 };

    Trial 2: Do the inorder process iterately, set a count number, when it equals to k, return corresponding value.

             Runtime: 24ms.

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     int kthSmallest(TreeNode* root, int k) {
    13         if(!root) return 0;
    14         stack<TreeNode* > stk;
    15         int order = 0;
    16         while(!stk.empty() || root){
    17             if(root){
    18                 stk.push(root);
    19                 root = root->left;
    20             }
    21             else{
    22                 root = stk.top();
    23                 stk.pop();
    24                 order++;
    25                 if(order == k) return root->val;
    26                 root = root->right;
    27             }
    28         }
    29     }
    30 };
  • 相关阅读:
    ElasticSearch记录(1)底层原理
    hbase学习记录(4)hbase和Hadoop整合(实现wrodcount程序)
    flume记录(2)监控文件和目录,对hdfs操作
    flume记录(1)使用
    hbase学习记录(3)JAVA_API操作hbase
    hbase学习记录(2)shell常用命令
    hbase学习记录(1)简介
    ssh三大框架整合
    spring事务管理
    Ubuntu 18.04版本设置root账户
  • 原文地址:https://www.cnblogs.com/amazingzoe/p/4698615.html
Copyright © 2020-2023  润新知