给定一个二叉搜索树的根节点 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
思路1:
中序遍历二叉搜索树,得到一个有序的集合,集合里的第k个就是答案
- /**
- * Definition for a binary tree node.
- * public class TreeNode {
- * int val;
- * TreeNode left;
- * TreeNode right;
- * TreeNode() {}
- * TreeNode(int val) { this.val = val; }
- * TreeNode(int val, TreeNode left, TreeNode right) {
- * this.val = val;
- * this.left = left;
- * this.right = right;
- * }
- * }
- */
- class Solution {
- public int kthSmallest(TreeNode root, int k) {
- String s = "";
- List<Integer> list = new ArrayList<>();
- travel( root, list );
- int out = 0;
- out = list.get( k-1 );
- return out;
- }
-
-
- private void travel(TreeNode node, List<Integer> list) {
- if( node == null )
- return;
- travel( node.left, list );
- list.add( node.val );
- travel( node.right, list );
- }
- }
思路2(优化,不需要全部遍历完整棵树,不过其实思路一也是不需要遍历完的,结果if判断即可):
中序遍历,遍历到第k个停止即可
- /**
- * Definition for a binary tree node.
- * public class TreeNode {
- * int val;
- * TreeNode left;
- * TreeNode right;
- * TreeNode() {}
- * TreeNode(int val) { this.val = val; }
- * TreeNode(int val, TreeNode left, TreeNode right) {
- * this.val = val;
- * this.left = left;
- * this.right = right;
- * }
- * }
- */
- class Solution {
- public int kthSmallest(TreeNode root, int k) {
- String s = "";
- int out = 0;
- Stack<Integer> stack = new Stack();
- travel1( root, stack, k );
- out = stack.pop();
-
- return out;
- }
-
- private void travel1(TreeNode node, Stack<Integer> stack, int k ) {
- if( node == null )
- return;
- travel1( node.left, stack, k );
- if( stack.size() == k )
- return;
- stack.push( node.val );
- travel1( node.right, stack, k );
- }
-
- }