230. Kth Smallest Element in a BST
2016-05-24 22:05
253 查看
Given a binary search tree, write a function
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).
1.我的答案(写的真的很烂)
2.别人的答案
(1)Binary Search (dfs): most preferable
(2)DFS in-order recursive:
(2)DFS in-order iterative:
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).
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: void kth(TreeNode* root, int& k, int& val){ if(root == NULL){ return; } kth(root->left, k, val); if(k > 1) k--; else if(k == 1){ k--; if(val == 0) val = root->val; return; } kth(root->right, k, val); } int kthSmallest(TreeNode* root, int k) { int val = 0; kth(root, k, val); return val; } };
2.别人的答案
3 ways implemented in JAVA: Binary Search, in-order iterative & recursive
(1)Binary Search (dfs): most preferablepublic int kthSmallest(TreeNode root, int k) { int count = countNodes(root.left); if (k <= count) { return kthSmallest(root.left, k); } else if (k > count + 1) { return kthSmallest(root.right, k-1-count); // 1 is counted as current node } return root.val; } public int countNodes(TreeNode n) { if (n == null) return 0; return 1 + countNodes(n.left) + countNodes(n.right); }
(2)DFS in-order recursive:
// better keep these two variables in a wrapper class private static int number = 0; private static int count = 0; public int kthSmallest(TreeNode root, int k) { count = k; helper(root); return number; } public void helper(TreeNode n) { if (n.left != null) helper(n.left); count--; if (count == 0) { number = n.val; return; } if (n.right != null) helper(n.right); }
(2)DFS in-order iterative:
public int kthSmallest(TreeNode root, int k) { Stack<TreeNode> st = new Stack<>(); while (root != null) { st.push(root); root = root.left; } while (k != 0) { TreeNode n = st.pop(); k--; if (k == 0) return n.val; TreeNode right = n.right; while (right != null) { st.push(right); right = right.left; } } return -1; // never hit if k is valid }
相关文章推荐
- git服务器搭建
- 前端面试总结
- 归并排序(非递归)
- vertica-dbvis实现failover和负载均衡
- ria service 单元测试
- linux 快速安装mysql
- 基于opencv的身份证识别系统
- Linux定时任务Crontab详解
- 关于版本升级的一点理解(VersionUpdate)
- linux基本命令(33)——df命令
- iOS开发之高级视图—— UITableView(二)编辑选中行
- python读写操作文件
- Reset CSS:只选对的,不选"贵"的
- Deep Learning Hangzhou Meetup--华为2012实验室&深度学习国际群 联合举办
- codeforces #300 A. Cutting Banner
- C++第6次作业
- Git 多人协作开发
- 56.com面试
- 优秀的技术Leader
- 背包问题