import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public class Solution {
/**
* 查找第K小的元素
*/
//中序遍历
public int kthSmallest(TreeNode root, int k) {
LinkedList<TreeNode> stack = new LinkedList<>();
while (root != null || !stack.isEmpty()) {
while (root != null) {
stack.push(root);
root = root.left;
}
if (!stack.isEmpty()) {
TreeNode node = stack.pop();
if (--k == 0) {
return node.val;
}
root = node.right;
}
}
return -1;
}
//中序遍历递归
public int kthSmallest2(TreeNode root, int k) {
List<Integer> list = new ArrayList<>();
inorder(list, root);
return list.get(k - 1);
}
void inorder(List<Integer> l, TreeNode root) {
if (root == null)
return;
inorder(l, root.left);
l.add(root.val);
inorder(l, root.right);
}
public int kthSmallest3(TreeNode root, int k) {
int leftCount = nodeCount(root.left);
if (leftCount + 1 == k) {
return root.val;
} else if (leftCount + 1 < k) {
return kthSmallest(root.right, k - 1 - leftCount);
} else {
return kthSmallest(root.left, k);
}
}
public int nodeCount(TreeNode root) {
if (root == null) {
return 0;
}
return 1 + nodeCount(root.left) + nodeCount(root.right);
}
//dfs解法
int count = 0;
int result = 0;
public int kthSmallest4(TreeNode root, int k) {
dfs(root, k);
return result;
}
public void dfs(TreeNode root, int k) {
if (root == null) {
return;
}
dfs(root.left, k);
count++;
if (count == k) {
result = root.val;
return;
}
dfs(root.right, k);
}
}
二叉搜索树查找第K小的元素
最新推荐文章于 2024-10-18 17:32:07 发布