题目描述
题干:
给定一个二叉搜索树的根节点 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
题目描述
返回树中第k个元素,根据二叉排序树的性质,中序遍历就是按照大小排序后的结果
这里我们需要第k个元素,就增加一个标志位来终止遍历即可
这里没有采用递归的方法,而是迭代方便终止循环找到第k个元素
正确代码
public int kthSmallest(TreeNode root, int k) {
Deque<TreeNode> stack = new ArrayDeque<>();
while (root != null || !stack.isEmpty()) {
while (root != null) {
stack.push(root);
root = root.left;
}
root = stack.pop();
--k;
if (k == 0) {
break;
}
root = root.right;
}
return root.val;
}
总结
其实根据二叉排序树的特性来解决是最正规的做法,但是相比一些其他另辟蹊径的方法
还是不太行,比如很多人直接记录节点个数或者采用平衡二叉排序树,直接就是神仙打架了
当时简单题做中序遍历的时候,好像还有一种颜色标记法,有兴趣的可以去看一下
如果文章存在问题或者有更好的题解,欢迎在评论区斧正和评论,各自努力,你我最高处见