题目
- 二叉搜索树中第K小的元素
给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。
示例 1:
输入:root = [3,1,4,null,2], k = 1
输出:1
示例 2:
输入:root = [5,3,6,2,4,null,null,1], k = 3
输出:3
提示:
树中的节点数为 n 。
1 <= k <= n <= 104
0 <= Node.val <= 104
解决思路
解决方法
方法一:
//完全可以先放后取
//而不是边取边放
//代码好些 逻辑也容易理解
fun kthSmallest2(root: TreeNode?, k: Int): Int {
val linkedList = LinkedList<TreeNode>()
var cur: TreeNode? = root
var curIndex = 1
while (!linkedList.isEmpty() || cur != null) {
while (cur != null) {
linkedList.push(cur)
cur = cur.left
}
cur = linkedList.pop()
if (curIndex++ == k) {
return cur!!.`val`
}
//当前节点不满足 移出去
cur = cur?.right
}
return -1
}
方法二:
我自己手写的,逻辑不是很清晰
队列的push 和 pop 不太好
public fun kthSmallest(root: TreeNode?, k: Int): Int {
val linkedList = LinkedList<TreeNode>()
var cur: TreeNode? = null
if (root != null) {
linkedList.add(root)
}
var curIndex = 1
while (!linkedList.isEmpty()) {
//当前cur为空 说明有一个新的根节点 需要遍历左孩子
if (cur == null) {
cur = linkedList.peek()
while (cur?.left != null) {
linkedList.push(cur.left)
cur = cur.left
}
} else {
cur = linkedList.peek()
}
if (curIndex++ == k) {
return cur!!.`val`
}
//当前节点不满足 移出去
linkedList.pop()
//右边有孩子 那么需要遍历左孩子
if (cur?.right != null) {
linkedList.push(cur.right)
cur = null
}
}
return -1
}
总结
按部就班就可以做好95%的工作 所以机器有时候比人做的更好 更快 不管是ETC 不管是围棋
大部分还都是平凡人
有的时候需要忘的差不多了才去些算法才能记忆深刻
做题频率确实低了很多