leetcode_230_二叉搜索树中第K小的元素
给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。
说明:
你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。
示例 1:
输入: root = [3,1,4,null,2], k = 1
3
/
1 4
2
输出: 1
示例 2:
输入: root = [5,3,6,2,4,null,null,1], k = 3
5
/
3 6
/
2 4
/
1
输出: 3
- 中序遍历,依次弹出最小值,当弹出到
- 第k个时,返回此节点的值
class Solution {
public int kthSmallest(TreeNode root, int k) {
Stack<TreeNode> stack = new Stack<>();
while(root != null || !stack.isEmpty()) {
while(root != null) {
stack.push(root);
root = root.left;
}
TreeNode node = stack.pop();
k--;
if(k == 0) return node.val;
root = node.right;
}
return -1;
}
}
class Solution {
public int kthSmallest(TreeNode root, int k) {
LinkedList<TreeNode> stack = new LinkedList<>();
while(root != null || !stack.isEmpty()) {
while(root != null) {
stack.add(root);
root = root.left;
}
TreeNode node = stack.removeLast();
k--;
if(k == 0) return node.val;
root = node.right;
}
return -1;
}
}
94. 二叉树的中序遍历
给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3]
1
2
/
3
输出: [1,3,2]
-
假设是二叉有序树
-
由根节点出发,先不断的遍历左节点,直到为null,此时节点值最小;
-
弹出,再由此节点引出的右节点,遍历右节点的左子节点,直到为空;
-
此时是第二小,弹出,如此循环
-
第一层while循环里的root != null 判断是为了刚开始,stack为null,不能进入循环加的
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
while(root != null || !stack.isEmpty()) {
while(root != null) {
stack.add(root);
root = root.left;
}
TreeNode node = stack.pop();
res.add(node.val);
root = node.right;
}
return res;
}
}