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?
Hint:
- Try to utilize the property of a BST.
- What if you could modify the BST node's structure?
- The optimal runtime complexity is O(height of BST).
就是找出DFS他parse的順序找出來
為了可以提早結束 我用-1代表找到
rank代表現在找到第幾個數字了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | /** * 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) { if(root==NULL)return 0; rank=0; DFS(root,k); return reuslt; } int DFS(TreeNode* root,int level){ if(root==NULL)return rank; int left=DFS(root->left,level); if(left<0)return -1; rank=rank+1; if(level==rank){ reuslt=root->val; return -1; } int right=DFS(root->right,level); if(right <0)return -1; return 1; } private: int rank; int reuslt; }; |
--------------------------
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | class Solution { public: TreeNode* current = NULL; stack<TreeNode*> s; int kthSmallest(TreeNode* root, int k) { current = root; int count = 1; while(1) { while(current) { s.push(current); current = current->left; } if(count == k) { TreeNode* node = s.top(); return node->val; } if(count != k) { TreeNode* node = s.top(); s.pop(); current = node->right; count++; } } } }; |
沒有留言:
張貼留言