LeetCode 230. 二叉探索ツリーのK番目の小さい要素(C++)

2306 ワード

二叉探索ツリーを指定し、関数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関数を最適化するにはどうすればいいですか?
考え方:
1つのツリーについて、シーケンスループの結果は、ツリーの各ノード値が小さいから大きいまで並べられた結果です.
/**
 * 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 {
    vector<int> vec;
    public:
    void dfs(TreeNode* root){
        if(root == NULL)
            return ;
        dfs(root->left);
        vec.push_back(root->val);
        dfs(root->right);
    }
    public:
    int kthSmallest(TreeNode* root, int k) {
        dfs(root);
        if(vec.size() >= k)
            return vec[k -1];
        return -1;
    }
};