寻找二叉搜索树的第K小的节点
来源:互联网 发布:如何做网络代销 编辑:程序博客网 时间:2024/05/12 16:32
题目要求:
230. Kth Smallest Element in a BST
- Total Accepted: 58991
- Total Submissions: 148753
- Difficulty: Medium
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?
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.
Subscribe to see which companies asked this question
三种解法:
public int kthSmallest(TreeNode root, int k) { int count=countNodes(root.left)+1; if(k==count) return root.val; if(k<count) return kthSmallest(root.left,k); else{ return kthSmallest(root.right,k-count); } } public int countNodes(TreeNode root){ if(root==null) return 0; return 1+countNodes(root.left)+countNodes(root.right); }以上解法最漂亮,用到了二叉树的结构特性与题目要求
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); }上面的解法就是中序遍历的解法,count 与 number 都应设置喂全局变量
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 }第三种解法应用了一个栈,与使用队列的效果是一样的,但是在可理解性上不如应用队列。
0 0
- 寻找二叉搜索树的第K小的节点
- 二叉搜索树的第k个节点
- 二叉搜索树的第k个节点
- 二叉搜索树的第K个节点
- 二叉搜索树的第k个节点
- 剑指offer-二叉搜索树的第K个节点
- 二叉搜索树的第K个节点
- 找出二叉搜索树第k大的节点
- 二叉搜索树的第K个节点
- Python:二叉搜索树的第k个节点
- 剑指offer63二叉搜索树的第k个节点
- 剑指offer_二叉搜索树的第k个节点
- 二叉搜索树的第k个节点
- 求二叉搜索树的第k个节点
- 二叉搜索树的第K个节点
- 二叉搜索书的第K个节点
- 二叉搜索树第k大个节点
- 剑指offer(64):二叉搜索树的第k大的节点
- CodeUp-2059 Problem G弹地小球
- ES6 原生promise 与 Q的比较学习
- 写一个linearayout,并且使得它的宽度适应屏幕宽度
- HDU1166 敌兵布阵 (树状数组->改点求段)
- 《UNIX环境高级编程》十一线程读书笔记
- 寻找二叉搜索树的第K小的节点
- Shell 处理命令行参数 getopts 和 getopt
- Window Server 2012许可证过期解决方法
- [Hadoop] 源码编译Hadoop 2.7.2
- new与malloc
- android基本架构
- #并查集模板#
- 怎么解决包冲突--删除EE5中的jar
- Linux添加service 服务