首页 > 其他分享 >力扣热题100 - 二叉树:二叉搜索树中第 K 小的元素

力扣热题100 - 二叉树:二叉搜索树中第 K 小的元素

时间:2024-09-16 12:54:38浏览次数:13  
标签:right TreeNode temp int 力扣 二叉树 100 root stack

题目描述:

题号:230

给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 小的元素(从 1 开始计数)。

图片


解题思路:

思路一:中序遍历二叉树 + 计数

根据二叉搜索树的性质,中序遍历得到的节点的顺序是从小到大递增的。

所以可以一边中序遍历,一边计数寻找第 K 小的节点。

时间复杂度:O(N)

空间复杂度:O(N) 

C++


// C++
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
    vector<int> Inorder;
    void inOrder(TreeNode* root) {
        if(root == nullptr) {
            return;
        }
        inOrder(root->left);
        Inorder.push_back(root->val);
        inOrder(root->right);
    }
public:
    int kthSmallest(TreeNode* root, int k) {
        inOrder(root);
        return Inorder[k - 1];
    }
};

go

// go
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func kthSmallest(root *TreeNode, k int) int {
    if root == nil {
        return 0
    }
    temp := root
    stack := []*TreeNode{}
    for {
        for temp != nil {
            stack = append(stack, temp)
            temp = temp.Left
        }
        stack, temp = stack[:len(stack)-1], stack[len(stack)-1]
        k--
        if k == 0 {
            return temp.Val
        }
        temp = temp.Right
    }
    return -1
}

标签:right,TreeNode,temp,int,力扣,二叉树,100,root,stack
From: https://blog.csdn.net/H_P10/article/details/142300408

相关文章

  • 力扣热题100 - 二叉树:二叉树展开为链表
    题目描述:题号:114给你二叉树的根结点 root ,请你将它展开为一个单链表:展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。解题思路:思路一:前序遍历后......
  • 用1100天做一款通用的管理后台框架
    前言去年年底,我写了一篇《如何做好一款管理后台框架》的文章,这是我对开发Fantastic-admin这款基于Vue的中后台管理系统框架两年多时间的一个思考与总结。很意外这么一篇标题平平无奇的文章能收获30k的浏览以及600多个收藏,似乎大家对这种非干货的文章也挺感兴趣。于是在这个......
  • 力扣刷题(6)
    两数之和II-输入有序数组两数之和II-输入有序数组-力扣思路:因为该数组是非递减顺序排列,因此可以设两个左右下标当左右下标的数相加大于target时,则表示右下标的数字过大,因此将右下标--当左右下标的数相加小于target时,则表示左下标的数字过小,因此将左下标++当相......
  • C++数据结构-二叉树的三种遍历方法(进阶篇)
    1.遍历简介:树作为非线性数据结构,在我们取出数据时就需要设计遍历,所谓遍历,就是按照一定的规则性,将数据结构中的所有数据全部依次访问,而二叉树本身并不具有天然的全局次序,故为实现遍历,需通过在各节点与其孩子之间约定某种局部次序,间接地定义某种全局次序,这便是我们常规定的先序......
  • C++数据结构-二叉树的存储方法(基础篇)
    1.简介根据前文的介绍,我们知道了二叉树的性值,其就是一种每一个结点中只允许拥有左右孩子(或为空)的树,这种数据结构在我们的实际设计中非常常用,如前文提到的STL中的set集合,其底层就是一颗标准的红黑树(二叉树的一种),我们这里以创建一颗二叉树并实现通过特定的插入顺序和读取顺序达......
  • 力扣136.只出现一次的数字
    题目描述:给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。解题思路:看到数组刚开始想的是排序后遍历,但是时间复杂度太高了......
  • 纯C 生成二叉树广义表 根据广义表重构二叉树
    讲解很多都写在注释里了,重构二叉树的过程后面单独拿出来讲直接上代码:#include<stdio.h>#include<time.h>#include<stdlib.h>#include<limits.h>typedefstructBiTree{ intdata; structBiTree*next[2];}BiTree;BiTree*BiTree_init(intval)//节点初始化{......
  • 力扣热题100 - 二叉树:验证二叉搜索树
    题目描述:题号:98给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。解题思路:思路一......
  • COMM 1100 Foundations of Communication
    COMM1100(A11)FOUNDATIONSOFCOMMUNICATIONSTUDIESFall2024COURSEDESCRIPTIONThiscourseoffersacomprehensiveoverviewofwhatitmeanstostudycommunications.Studentswillexploreclassicdefinitionsandmodelsofcommunicationsandtracehowth......
  • LeetCode_0144. 二叉树前序遍历 & LeetCode_0096. 二叉树中序遍历 & LeetCode_0145.
    题目描述  给你二叉树的根节点root,返回它节点值的前序/中序/后序遍历。递归写法LeetCode_0144.前序中左右voidmyPreorder(TreeNode*root,vector<int>&ans){if(!root){return;}ans.emplace_back(root->val);myPre......