二叉搜索树中第K小的元素
给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。
- 数组递归生成二叉树
- 二叉搜索树中序遍历=增序集合
/*
* Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved.
*/
package com.huawei.prac;
import java.util.ArrayList;
import java.util.List;
class SolutionRd {
public static void main(String[] args) {
Integer[] root = {3, 1, 4, null, 2};
int k = 1;
TreeNode treeRoot = iniTree(root, 1);
System.out.println(treeRoot);
System.out.println(kthSmallest(treeRoot, k));
}
/**
* 230. 二叉搜索树中第K小的元素【数组递归生成二叉树+二叉树中序遍历】
*
* @param root 树的根节点
* @param k 第K个最小元素
* @return 第K个最小元素的值
*/
public static int kthSmallest(TreeNode root, int k) {
List<Integer> list = new ArrayList<>();
inOrderTrav(root, list);
// System.out.println(list);
return list.get(k - 1);
}
private static void inOrderTrav(TreeNode root, List<Integer> list) {
if (root == null) {
return;
}
inOrderTrav(root.left, list);
list.add(root.val);
inOrderTrav(root.right, list);
}
private static TreeNode iniTree(Integer[] root, int index) {
if (index > root.length) {
return null;
}
Integer value = root[index - 1];
if (value == null) {
return null;
}
TreeNode node = new TreeNode(value);
node.left = iniTree(root, index * 2);
node.right = iniTree(root, index * 2 + 1);
return node;
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {
this(0, null, null);
}
TreeNode(int val) {
this(val, null, null);
}
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
@Override
public String toString() {
return "TreeNode{" + "val=" + val + ", left=" + left + ", right=" + right + '}';
}
}```