力扣hot100 二叉搜索树中第k小的元素 分治 中序遍历
2024-01-08 21:53:52
😋 分治
/**
* 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)
{
int n = nodeCount(root.left);//计算当前树的左子树的结点数
if (n + 1 == k)// 说明根节点就是第 k 小的数
return root.val;
else if (n + 1 < k)// 说明第 k 小的数在当前树的 右子树的第(k-n-1)小处
return kthSmallest(root.right, k - n - 1);
else// 说明第 k 小的数在当前树的 左子树的 第(k)小处
return kthSmallest(root.left, k);
}
/**
* @param root 当前树的根节点
* @return 当前树的总结点数(包含根节点)
*/
int nodeCount(TreeNode root)
{
if (root == null)
return 0;
return 1 + nodeCount(root.left) + nodeCount(root.right);
}
}
😋 递归中序遍历
/**
* 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 {
int num = 0;
int res;
public int kthSmallest(TreeNode root, int k) {
inorderTraversal(root, k);
return res;
}
private void inorderTraversal(TreeNode node, int k) {
if (node == null || num > k) {
return;
}
inorderTraversal(node.left, k);
num++;
if (num == k) {
res = node.val;
return;
}
inorderTraversal(node.right, k);
}
}
文章来源:https://blog.csdn.net/lt6666678/article/details/135381892
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!