LeetCode 230 二叉搜索树中第K小的元素
题目描述
给定一个二叉搜索树的根节点 root
,和一个整数 k
,请你设计一个算法查找其中第 k
个最小元素(从 1 开始计数)。
题目分析
本题需要求出二叉搜索树中的第K小元素,我们之前介绍过二叉搜索树的性质:二叉搜索树的中序遍历结果是整个树节点的升序排序序列
因此,我们可以借助中序遍历排完序后再找出其中第K小元素即可。
解决
方式1:递归中序遍历
public static int kthSmallest2(TreeNode root, int k)
{
ArrayList<Integer> res = inOrder(root, new ArrayList<>());
//由于从1开始计数,所以返回第K减1个元素即是第K小元素
return res.get(k - 1);
}
/**
* 中序遍历
* @param root
* @param list
* @return
*/
public static ArrayList<Integer> inOrder(TreeNode root, ArrayList<Integer> list)
{
//如果左子节点不为空,递归左孩子
if (root.left != null)
{
inOrder(root.left, list);
}
//添加当前节点
list.add(root.val);
//如果右子节点不为空,递归右孩子
if (root.right != null)
{
inOrder(root.right, list);
}
return list;
}
方式2:迭代中序遍历
public int kthSmallest(TreeNode root, int k)
{
//使用栈结构来保存遍历结果
Stack<TreeNode> stack = new Stack<>();
while (true)
{
//当前节点不为空,入栈
while (root != null)
{
stack.add(root);
//迭代左孩子
root = root.left;
}
//弹出栈顶元素
root = stack.pop();
//当第k次弹出后即为第k小元素
if (--k == 0)
{
return root.val;
}
//迭代右孩子
root = root.right;
}
}