230. Kth Smallest Element in a BST
2017-01-03 18:18
232 查看
Given a binary search tree, write a function
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).
Credits:
Special thanks to @ts for adding this problem and creating all test cases.
这又是一道关于二叉搜索树 Binary Search Tree 的题, LeetCode中关于BST的题有Validate
Binary Search Tree 验证二叉搜索树, Recover Binary Search Tree 复原二叉搜索树, Binary
Search Tree Iterator 二叉搜索树迭代器, Unique Binary Search Trees 独一无二的二叉搜索树, Unique
Binary Search Trees II 独一无二的二叉搜索树之二,Convert Sorted Array to Binary
Search Tree 将有序数组转为二叉搜索树 和 Convert Sorted List to Binary Search
Tree 将有序链表转为二叉搜索树。那么这道题给的提示是让我们用BST的性质来解题,最重要的性质是就是左<根<右,那么如果用中序遍历所有的节点就会得到一个有序数组。所以解题的关键还是中序遍历啊。关于二叉树的中序遍历可以参见我之前的博客Binary
Tree Inorder Traversal 二叉树的中序遍历,里面有很多种方法可以用,我们先来看一种非递归的方法:
解法一
当然,此题我们也可以用递归来解,还是利用中序遍历来解,代码如下:
解法二:
参考资料:
https://leetcode.com/discuss/43275/use-divide-and-conquer-to-solve-this-problem
LeetCode All in One 题目讲解汇总(持续更新中...)
kthSmallestto 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).
Credits:
Special thanks to @ts for adding this problem and creating all test cases.
这又是一道关于二叉搜索树 Binary Search Tree 的题, LeetCode中关于BST的题有Validate
Binary Search Tree 验证二叉搜索树, Recover Binary Search Tree 复原二叉搜索树, Binary
Search Tree Iterator 二叉搜索树迭代器, Unique Binary Search Trees 独一无二的二叉搜索树, Unique
Binary Search Trees II 独一无二的二叉搜索树之二,Convert Sorted Array to Binary
Search Tree 将有序数组转为二叉搜索树 和 Convert Sorted List to Binary Search
Tree 将有序链表转为二叉搜索树。那么这道题给的提示是让我们用BST的性质来解题,最重要的性质是就是左<根<右,那么如果用中序遍历所有的节点就会得到一个有序数组。所以解题的关键还是中序遍历啊。关于二叉树的中序遍历可以参见我之前的博客Binary
Tree Inorder Traversal 二叉树的中序遍历,里面有很多种方法可以用,我们先来看一种非递归的方法:
解法一
class Solution { public: int kthSmallest(TreeNode* root, int k) { int cnt = 0; stack<TreeNode*> s; TreeNode *p = root; while (p || !s.empty()) { while (p) { s.push(p); p = p->left; } p = s.top(); s.pop(); ++cnt; if (cnt == k) return p->val; p = p->right; } return 0; } };
当然,此题我们也可以用递归来解,还是利用中序遍历来解,代码如下:
解法二:
class Solution { public: int kthSmallest(TreeNode* root, int k) { return kthSmallestDFS(root, k); } int kthSmallestDFS(TreeNode* root, int &k) { if (!root) return -1; int val = kthSmallestDFS(root->left, k); if (!k) return val; if (!--k) return root->val; return kthSmallestDFS(root->right, k); } };
参考资料:
https://leetcode.com/discuss/43275/use-divide-and-conquer-to-solve-this-problem
LeetCode All in One 题目讲解汇总(持续更新中...)
相关文章推荐
- LeetCode *** 230. Kth Smallest Element in a BST
- 【leetcode】230. Kth Smallest Element in a BST
- <LeetCode OJ> 230. Kth Smallest Element in a BST
- 230. Kth Smallest Element in a BST(unsolved)
- leetcode_230. Kth Smallest Element in a BST
- 230. Kth Smallest Element in a BST
- 230. Kth Smallest Element in a BST
- [LeetCode] Algorithms-45. 230. Kth Smallest Element in a BST
- 230. Kth Smallest Element in a BST | 二叉排序树中查找第K小的数
- 230. Kth Smallest Element in a BST
- 230. Kth Smallest Element in a BST
- leetcode 230. Kth Smallest Element in a BST
- LeetCode 230. Kth Smallest Element in a BST 解题报告
- 【LeetCode】 230. Kth Smallest Element in a BST
- 230. Kth Smallest Element in a BST
- leetcode -- 230. Kth Smallest Element in a BST 【遍历 + 计数】
- 【LeetCode】230. Kth Smallest Element in a BST
- leetcode No230. Kth Smallest Element in a BST
- leetcode 230. Kth Smallest Element in a BST
- 230. Kth Smallest Element in a BST