【LeetCodeゼロブラシから】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?
回答:
「プログラミングの美しさ」には、配列(並べ替えられていない)のK番目の数を探すという問題がある.ここはBSTで、すでに順番があって、もっと便利です.
  • 左サブツリーの数がK以上である場合、左サブツリーのK番目のツリーを直接探します.
  • 左サブツリーの数がK−1に等しい場合、ルートノードはK番目である.
  • 左サブツリーの数がKより小さい場合、右サブツリーの(K-leftSum-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 {
    public:
        int findNodeSum(TreeNode* root) {
            if (root == NULL)       return 0;
            return (findNodeSum(root->left) + findNodeSum(root->right) + 1);
        }
        
        int kthSmallest(TreeNode* root, int k) {
            int leftSum = findNodeSum(root->left);
            if (leftSum >= k)            return kthSmallest(root->left, k);
            else if (leftSum == k - 1)  return root->val;
            else
            {
                return kthSmallest(root->right,k - leftSum - 1);
            }
        }
    };
    題はまだここまで終わっていません.もしBSTがいつも修正していたら?
    ツリーノードの構造を変更し、左サブツリーのノードの合計数を増やすことが望ましい.このような探索の複雑さはO(height)である.