一、迭代法
运行结果
执行结果:通过
执行用时 :1 ms, 在所有 Java 提交中击败了83.31%的用户
内存消耗 :37.9 MB, 在所有 Java 提交中击败了25.55%的用户
代码与注释
// 求解思路:题目已知条件是二叉搜索树,中序遍历得到的结果就是升序的。
class Solution {
public int kthSmallest(TreeNode root, int k) {
LinkedList<TreeNode> list = new LinkedList<>();
// 中序遍历
while (root != null || !list.isEmpty())
{
while (root != null)
{
list.add(root);
root = root.left;
}
root = list.removeLast();
if (--k == 0) return root.val;
root = root.right;
}
return -1;
}
}
做题体会
- 二叉搜索树(又称二叉排序树,BST),节点取值,左子树小于根节点,根节点小于右子树,采用中序遍历的方式得到的结果恰好是升序的。
- 利用升序的先天条件,可以进行中序遍历,结合递归的思想,当从第一个叶子结点开始,遍历到第k个,得到的值即为第k小的元素。这个过程无需对中间数据进行记录。
- 采用递归的方式,遇到最终结果可以提前终止。
- 其中- -k==0与k- -==0的区别:- -k先减,后判断,k- -是先判断,后减。
- 前序搜索、中序搜索、后序搜索均属于深度优先搜索(DFS),对应广度优先搜索(BFS)。前序、中序、后序指的是根节点出现的次序,根节点最先出现就是前序,其他情况类似。最简单的方式是用三个节点分析,这里用7个节点的二叉树举例。
- 时间复杂度:O(logN+k),到达叶子节点:logN,遍历到第k个数:k。
空间复杂度:O(logN),无需额外k的空间记录出现的元素,通过- -k==0实现,所以平均需要二叉树深度的存储空间:logN。 - 如果二叉树一般化,不是BST,可以在遍历树的过程中维护一个size为k的大顶堆,当遍历完成,最终结果出现在堆顶。