LeetCode 算法:二叉搜索樹中第K小的元素 c++

原題鏈接🔗:二叉搜索樹中第K小的元素
難度:中等????

題目

給定一個二叉搜索樹的根節點 root ,和一個整數 k ,請你設計一個算法查找其中第 k 小的元素(從1開始計數)。

示例 1
在這里插入圖片描述

輸入:root = [3,1,4,null,2], k = 1
輸出:1

示例 2
在這里插入圖片描述

輸入:root = [5,3,6,2,4,null,null,1], k = 3
輸出:3

提示

  • 樹中的節點數為 n 。
  • 1 <= k <= n <= 104
  • 0 <= Node.val <= 104

進階:如果二叉搜索樹經常被修改(插入/刪除操作)并且你需要頻繁地查找第 k 小的值,你將如何優化算法?

題解

二叉搜索樹

二叉搜索樹(Binary Search Tree,簡稱BST)是一種特殊的二叉樹,它具有以下性質:

  1. 有序性:對于樹中的每個節點,其左子樹上所有節點的值都小于該節點的值,其右子樹上所有節點的值都大于或等于該節點的值。

  2. 沒有兄弟節點:每個節點最多只有一個左子節點和一個右子節點。

  3. 每個節點存儲一個鍵值:在二叉搜索樹中,每個節點通常存儲一個鍵值,該鍵值用于維護樹的有序性。

  4. 樹結構:二叉搜索樹是樹結構,這意味著它是一個沒有環的分層數據結構。

  5. 平衡性:理想情況下,二叉搜索樹是平衡的,即左右子樹的高度差不超過1。平衡的二叉搜索樹可以保證操作(如搜索、插入和刪除)的時間復雜度為O(log n)。但在最壞的情況下,如果插入的元素是有序的,樹將退化成鏈表,時間復雜度變為O(n)。

二叉搜索樹的應用非常廣泛,因為它提供了高效的數據存儲和檢索方式。以下是一些基本操作:

  • 搜索:在BST中搜索一個元素,可以從頭節點開始,根據目標值與當前節點值的比較結果,決定是向左子樹還是向右子樹搜索。這個過程可以遞歸或迭代進行,直到找到目標值或到達葉子節點。

  • 插入:向BST中插入一個新元素,首先搜索該元素應該插入的位置,然后根據BST的性質將其插入到適當的位置。

  • 刪除:從BST中刪除一個元素,需要考慮幾種情況:刪除的節點沒有子節點、有一個子節點或有兩個子節點。在刪除節點后,需要調整樹以保持BST的性質。

  • 遍歷:BST可以通過前序、中序、后序和層序遍歷來訪問所有節點。中序遍歷特別有用,因為它將按照升序訪問所有節點。

二叉搜索樹的實現通常涉及到遞歸和迭代技術,以及對樹結構的深入理解。在實際應用中,為了提高性能,可能會使用自平衡的二叉搜索樹,如AVL樹或紅黑樹。

中序遍歷

二叉樹的中序遍歷是一種遍歷二叉樹的方法,其遍歷順序為:先遍歷左子樹,然后訪問根節點,最后遍歷右子樹。這種遍歷方式可以確保在訪問任何節點之前,其所有左子節點已經被訪問過,同樣地,在訪問任何節點之后,其所有右子節點也會被訪問。

中序遍歷對于二叉搜索樹(BST)特別有用,因為它會按照節點值的非遞減順序訪問所有節點,即中序遍歷的結果是一個有序數組。

以下是中序遍歷的基本步驟:

  1. 訪問左子樹:首先,遞歸地對左子樹進行中序遍歷。

  2. 訪問根節點:然后,訪問根節點。在遍歷過程中,通常會將根節點的值添加到一個列表中。

  3. 訪問右子樹:最后,遞歸地對右子樹進行中序遍歷。

中序遍歷的時間復雜度為O(n),其中n是樹中節點的數量,因為它需要訪問樹中的每個節點。空間復雜度取決于遞歸調用的深度,最壞情況下是O(n)(當樹退化成鏈表時),最好情況下是O(log
n)(當樹是平衡的)。

中序遍歷遞歸法

  1. 解題思路

在LeetCode上,題目“二叉搜索樹中第K小的元素”通常要求你找到一個二叉搜索樹(BST)中第K小的元素。二叉搜索樹的性質是:對于樹中的任何節點,其左子樹上的所有節點的值都小于該節點的值,其右子樹上的所有節點的值都大于該節點的值。

解題思路如下:

  • 理解BST的性質:首先,要利用BST的性質來簡化問題。在BST中,中序遍歷(左-根-右)會以遞增的順序訪問所有節點。

  • 中序遍歷:由于題目要求找到第K小的元素,我們可以通過中序遍歷BST來實現。在遍歷過程中,記錄訪問的節點數量。

  • 計數與停止:在中序遍歷的過程中,當訪問到第K個節點時,停止遍歷。這個節點就是所求的第K小的元素。

  • 遞歸或迭代:中序遍歷可以通過遞歸或迭代的方式實現。遞歸是更直觀的方法,但迭代可以避免潛在的遞歸深度問題。

  • 實現算法:編寫代碼實現上述邏輯。

  1. c++ demo
#include <iostream>
#include <vector>// 定義二叉樹的節點結構
struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};class Solution {
public:// 主函數,接收二叉搜索樹的根節點和K值,返回第K小的元素int kthSmallest(TreeNode* root, int k) {std::vector<int> elements;inOrderTraversal(root, elements, k);return elements[k - 1]; // 由于數組索引從0開始,所以用k-1}private:// 中序遍歷輔助函數,同時接收一個vector來存儲遍歷結果void inOrderTraversal(TreeNode* node, std::vector<int>& elements, int k) {if (!node || elements.size() >= k) {return;}// 遍歷左子樹inOrderTraversal(node->left, elements, k);// 訪問當前節點if (elements.size() < k) {elements.push_back(node->val);}// 遍歷右子樹inOrderTraversal(node->right, elements, k);}
};// 示例使用
int main() {// 構建一個示例二叉搜索樹//       3//      / \//     1   4//      \//       2TreeNode* root = new TreeNode(3);root->left = new TreeNode(1);root->right = new TreeNode(4);root->left->right = new TreeNode(2);Solution solution;int k = 3; // 假設我們要找第3小的元素std::cout << "The " << k << "st smallest element is: " << solution.kthSmallest(root, k) << std::endl;// 清理分配的內存(在實際應用中應該使用智能指針來自動管理內存)delete root->left->right;delete root->left;delete root->right;delete root;return 0;
}
  • 輸出結果:

The 3st smallest element is: 3

  1. 代碼倉庫地址:kthSmallest

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/40189.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40189.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/40189.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網絡爬蟲之什么是代碼混淆?初步理解代碼混淆

爬蟲逆向之什么是代碼混淆&#xff1f;初步理解代碼混淆 在網絡爬蟲和逆向工程的過程中&#xff0c;代碼混淆是一項常見的技術&#xff0c;旨在保護代碼不被輕易理解和逆向。對于爬蟲工程師來說&#xff0c;理解并破解代碼混淆是一個重要的技能。本文將詳細介紹代碼混淆的基本概…

GUI開發

Question One Java 實現動作監聽&#xff0c;網格布局添加四個按鈕&#xff0c;實現四個不同的文本顯示 import java.awt.*; import java.awt.event.*; import javax.swing.*;class myGUI extends JFrame implements ActionListener{private Button b1, b2, b3, b4;private Tex…

0627,0628,0629,排序,文件

01&#xff1a;請實現選擇排序&#xff0c;并分析它的時間復雜度&#xff0c;空間復雜度和穩定性 void selection_sort(int arr[], int n); 解答&#xff1a; 穩定性&#xff1a;穩定&#xff0c; 不穩定的&#xff0c;會發生長距離的交換 4 9 9 4 1 &#xf…

ubuntu,linux下屏蔽壞塊方法-240625-240702封存

在windows下的屏蔽壞道的方法 機械硬盤壞道的文件系統級別的屏蔽方法_硬盤如何屏蔽壞扇區-CSDN博客 https://blog.csdn.net/cyuyan112233/article/details/139408503?spm1001.2014.3001.5502 【免費】磁盤壞道屏蔽工具磁盤壞道屏蔽工具_機械硬盤屏蔽壞扇區資源-CSDN文庫 https…

第一周題目總結

1.車爾尼有一個數組 nums &#xff0c;它只包含 正 整數&#xff0c;所有正整數的數位長度都 相同 。 兩個整數的 數位不同 指的是兩個整數 相同 位置上不同數字的數目。 請車爾尼返回 nums 中 所有 整數對里&#xff0c;數位不同之和。 示例 1&#xff1a; 輸入&#xff1a…

【嵌入式DIY實例-ESP8266篇】-LCD ST7735顯示網絡時間

LCD ST7735顯示網絡時間 文章目錄 LCD ST7735顯示網絡時間1、硬件準備2、代碼實現本文將介紹如何使用 ESP8266 NodeMCU Wi-Fi 板實現互聯網時鐘,其中時間和日期顯示在 ST7735 TFT 顯示屏上。 ST7735 TFT是一款分辨率為128160像素的彩色顯示屏,采用SPI協議與主控設備通信。 1…

Python中的變量和數據類型:Python中有哪些基本數據類型以及變量是如何聲明的

在Python中&#xff0c;變量是用來存儲數據的容器&#xff0c;而數據類型則定義了這些數據的種類。Python是一種動態類型語言&#xff0c;這意味著你不需要在聲明變量時指定其類型&#xff1b;Python解釋器會在運行時自動確定變量的類型。 Python中的基本數據類型 Python中有…

SQL語句(DML)

DML英文全稱是Data Manipulation Language&#xff08;數據操作語言&#xff09;&#xff0c;用來對數據庫中表的數據記錄進行增刪改等操作 DML-添加數據 insert into employee(id, workno, name, gender, age, idcard) values (1,1,Itcast,男,10,123456789012345678);select *…

AI 與數據的智能融合丨大模型時代下的存儲系統

WOT 全球技術創新大會2024北京站于 6 月 22 日圓滿落幕。本屆大會以“智啟新紀&#xff0c;慧創萬物”為主題&#xff0c;邀請到 60 位不同行業的專家&#xff0c;聚焦 AIGC、領導力、研發效能、架構演進、大數據等熱門技術話題進行分享。 近年來&#xff0c;數據和人工智能已…

記錄搭建一臺可域名訪問的HTTPS服務器

一、背景 近期公司業務涉及到微信小程序&#xff0c;即將開發完成需要按照微信小程序平臺的要求提供帶證書的域名請求服務器。 資源背景介紹如下&#xff1a; 1、域名 公司已有一個二級域名&#xff0c;再次申請新的二級域名并且實現ICP備案不僅需要花重金重新購買&#xff0c;…

Docker實現Redis主從,以及哨兵機制

Docker實現Redis主從,以及哨兵機制 目錄 Docker實現Redis主從,以及哨兵機制準備Redis鏡像創建Redis主節點配置文件啟動Redis從節點確認主從連接哨兵主要功能配置哨兵文件創建Redis哨兵的Docker容器 要通過Docker實現Redis的主從&#xff08;master-slave&#xff09;復制&#…

汽車EDI: BMW EDI項目案例

寶馬集團是全世界成功的汽車和摩托車制造商之一&#xff0c;旗下擁有BMW、MINI和Rolls-Royce三大品牌&#xff1b;同時提供汽車金融和高檔出行服務。作為一家全球性公司&#xff0c;寶馬集團在14個國家擁有31家生產和組裝廠&#xff0c;銷售網絡遍及140多個國家和地區。 本文主…

什么是 Socks5 代理?了解和使用 SOCKS5 代理的終極指南

SOCKS5是什么以及它如何工作&#xff1f; 在網絡和互聯網協議領域&#xff0c;有多種工具和技術在確保安全高效的通信方面發揮著至關重要的作用。 SOCKS5 就是這樣一個工具&#xff0c;它代表套接字安全版本 5。 在這篇博文中&#xff0c;我們將深入探討 SOCKS5 的細節&…

CoAtNet(NeurIPS 2023, Google)論文解讀

paper&#xff1a;CoAtNet: Marrying Convolution and Attention for All Data Sizes third-party implementation&#xff1a;https://github.com/huggingface/pytorch-image-models/blob/main/timm/models/maxxvit.py 背景 自AlexNet以來&#xff0c;ConvNets一直是計算機…

【基于R語言群體遺傳學】-5-擴展到兩個以上等位基因及多基因位點

我們現在繼續對于群體遺傳學進行統計建模&#xff0c;書接上回&#xff0c;我們討論了孤雌生殖的物種違反哈代溫伯格遺傳比例的例子&#xff0c;那我們現在來看多于兩個等位基因的情況的計算。 如果沒有看過之前文章的同學&#xff0c;可以先去看一下之前的文章&#xff1a; …

開源租房項目

項目名稱項目地址描述體驗地址后端代碼前端代碼小程序端代碼gitHubstart租房或房屋交易項目https://github.com/saysky/manland?tabreadme-ov-filePC端 管理端http://manland.liuyanzhao.com/有有無房適–房屋租賃管理平臺https://github.com/LiuXIn011/rightHouse開源房屋管理…

非對稱加密算法原理與應用1——秘鑰的生成

作者:私語茶館 1.前言 非對稱算法有非常多的用途,實現license管控,數字簽名,加密內容等等,由于涉及場景和標準非常多,因此實際使用過程中還是存在一定門檻,這里記錄一下利用非對稱算法RSA的應用關鍵點,并提供實現license管理的案例。預計拆分為以下幾個章節: (1)秘…

Apipost接口測試工具的原理及應用詳解(三)

本系列文章簡介: 隨著軟件行業的快速發展,API(應用程序編程接口)作為不同軟件組件之間通信的橋梁,其重要性日益凸顯。API的質量直接關系到軟件系統的穩定性、性能和用戶體驗。因此,對API進行嚴格的測試成為軟件開發過程中不可或缺的一環。在眾多API測試工具中,Apipost憑…

【分布式數據倉庫Hive】HivQL的使用

目錄 一、Hive的基本操作 1. 使用Hive創建數據庫test 2. 檢索數據庫&#xff08;模糊查看&#xff09;&#xff0c;檢索形如’te*’的數據庫 3. 查看數據庫test詳情 4. 刪除數據庫test 5. 創建一個學生數據庫Stus&#xff0c;在其中創建一個內部表Student&#xff0c;表格…

ubuntu20.04在anaconda環境下不能使用catkin_make

ubuntu20.04在anaconda環境下不能直接使用catkin_make編譯&#xff0c;報錯顯示需要安裝python3-empy 這時候查詢會發現該軟件包已經安裝了&#xff0c;但是是在ROS環境中&#xff0c;安裝anaconda環境后python解釋器的指向變了&#xff0c;所以需要在anaconda環境中再裝pytho…