230. 二叉搜索樹中第K小的元素

介紹

中序遍歷:左子樹 -> 中 -> 右子樹

二叉搜索樹:中序遍歷可以得到有序的序列

遞歸法

1.使用函數循環遞歸處理

2.使用一個數組來保存 k, 保證在個個遞歸函數中都能看到 看的變化;每訪問一個節點,這個數減一,當數組中的數為1時,即訪問到了第k小的數

/*** Definition for a binary tree node.* public class TreeNode {*     public int val;*     public TreeNode left;*     public TreeNode right;*     public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
public class Solution {public int KthSmallest(TreeNode root, int k) {// 輔助結構,當 k == 1 時 表示訪問到 第 k個最小的元素int[] aux = new int[] { k };return Traverse(root, aux);    }// 遞歸訪問public int Traverse(TreeNode node, int[] aux) {if(node == null){// 用 -1 表示訪問到終點return -1;}// 先訪問左子樹{var val = Traverse(node.left, aux);if(val != -1){return val;}}// 訪問該節點{if(aux[0] == 1){// 結果return node.val;}aux[0]--;}// 后訪問右子樹{var val = Traverse(node.right, aux);if(val != -1){return val;}}// 這里是不會走到的根據題意return -1;}
}

優化:

1.使用 引用傳遞 k, 確保遞歸函數都能看到k的變換

2.每次訪問右子樹時,不用判斷直接返回結果

/*** Definition for a binary tree node.* public class TreeNode {*     public int val;*     public TreeNode left;*     public TreeNode right;*     public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
public class Solution {public int KthSmallest(TreeNode root, int k) {// 輔助結構,當 k == 1 時 表示訪問到 第 k個最小的元素int aux = k;return Traverse(root, ref aux);    }// 遞歸訪問public int Traverse(TreeNode node, ref int aux) {if(node == null){// 用 -1 表示訪問到終點return -1;}// 先訪問左子樹{var val = Traverse(node.left, ref aux);if(val != -1){return val;}}// 訪問該節點{if(aux == 1){// 結果return node.val;}aux--;}// 后訪問右子樹// {//     var val = Traverse(node.right, ref aux);//     if(val != -1)//     {//         return val;//     }// }// // 這里是不會走到的根據題意// return -1;// 一個優化,這里直接返回,如果沒找到這里就返回-1return Traverse(node.right, ref aux);}
}

迭代法

1.使用數據結構Stack,模擬真實的棧處理流程

/*** Definition for a binary tree node.* public class TreeNode {*     public int val;*     public TreeNode left;*     public TreeNode right;*     public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
public class Solution {public int KthSmallest(TreeNode root, int k) {// 借助 Stack 模擬棧Stack<TreeNode> s = new Stack<TreeNode>();// 先讓第一個節點進棧,后面流程就處理一致了s.Push(root);// 根據題意一定存在結果// while(s.Count > 0)while(true){// 訪問左子樹var top = s.Peek();if(top != null){s.Push(top.left);continue;}// 將null節點彈出棧s.Pop();// 訪問當前節點,這里不用判斷 s的數量,根據代碼可知,這里至少存在一個節點var visit = s.Pop();if(k == 1){// 第k最小元素return visit.val;}k--;// 訪問右子樹s.Push(visit.right);}return -1;}
}

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

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

相關文章

軟件測試基礎篇——Redis

Redis Redis數據庫的配置與連接 解壓redis數據庫的安裝包&#xff08;建議把解壓后的安裝包放到磁盤的根目錄&#xff0c;方便訪問操作&#xff09;打開【命令行窗口】&#xff1a;winR在命令行窗口&#xff0c;進入到redis安裝目錄中 ? 格式一&#xff1a;cd /d redis目錄…

Linux安裝Zookeeper

1、Zookeeper簡介 ZooKeeper是一個分布式的&#xff0c;開放源碼的分布式應用程序協調服務&#xff0c;是Google的Chubby一個開源的實現&#xff0c;是Hadoop和Hbase的重要組件。它是一個為分布式應用提供一致性服務的軟件&#xff0c;提供的功能包括&#xff1a;配置維護、域…

自然語言處理從入門到應用——LangChain:記憶(Memory)-[記憶的類型Ⅲ]

分類目錄&#xff1a;《自然語言處理從入門到應用》總目錄 對話令牌緩沖存儲器ConversationTokenBufferMemory ConversationTokenBufferMemory在內存中保留了最近的一些對話交互&#xff0c;并使用標記長度來確定何時刷新交互&#xff0c;而不是交互數量。 from langchain.me…

基于灰狼優化(GWO)、帝國競爭算法(ICA)和粒子群優化(PSO)對梯度下降法訓練的神經網絡的權值進行了改進(Matlab代碼實現)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;歡迎來到本博客????&#x1f4a5;&#x1f4a5; &#x1f3c6;博主優勢&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客內容盡量做到思維縝密&#xff0c;邏輯清晰&#xff0c;為了方便讀者。 ??座右銘&a…

環保行業如何開發廢品回收微信小程序

廢品回收是近年來受到越來越多人關注的環保行動。為了推動廢品回收的普及和方便&#xff0c;我們可以利用微信小程序進行制作&#xff0c;方便人們隨時隨地參與廢品回收。 首先&#xff0c;我們需要注冊并登錄喬拓云賬號&#xff0c;并進入后臺。喬拓云是一個提供微信小程序制作…

數據結構(一):順序表詳解

在正式介紹順序表之前&#xff0c;我們有必要先了解一個名詞&#xff1a;線性表。 線性表&#xff1a; 線性表是&#xff0c;具有n個相同特性的數據元素的有限序列。常見的線性表&#xff1a;順序表、鏈表、棧、隊列、數組、字符串... 線性表在邏輯上是線性結構&#xff0c;但…

【云原生】Pod詳講

目錄 一、Pod基礎概念1.1//在Kubrenetes集群中Pod有如下兩種使用方式&#xff1a;1.2pause容器使得Pod中的所有容器可以共享兩種資源&#xff1a;網絡和存儲。1.3kubernetes中的pause容器主要為每個容器提供以下功能&#xff1a;1.4Kubernetes設計這樣的Pod概念和特殊組成結構有…

Django中級指南:理解并實現Django的模型和數據庫遷移

Django 是一個極其強大的 Python Web 框架&#xff0c;它提供了許多工具和特性&#xff0c;能夠幫助我們更快速、更便捷地構建 Web 應用。在本文中&#xff0c;我們將會關注 Django 中的模型&#xff08;Models&#xff09;和數據庫遷移&#xff08;Database Migrations&#x…

上傳代碼到GitCode

Git 全局設置 git config --global user.name "AnyaPapa" git config --global user.email "fangtaihongqq.com" 添加SSH密鑰 Mac終端輸入命令 cd existing_folder git init git remote add origin gitgitcode.net:Java_1710/test.git git add . git co…

2023國賽數學建模A題思路分析

文章目錄 0 賽題思路1 競賽信息2 競賽時間3 建模常見問題類型3.1 分類問題3.2 優化問題3.3 預測問題3.4 評價問題 4 建模資料 0 賽題思路 &#xff08;賽題出來以后第一時間在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 競賽信息 全國大學生數學建模…

Mac電腦如何把照片以文件格式導出?

在Mac電腦上&#xff0c;我們經常會拍攝、保存和編輯各種照片。有時候&#xff0c;我們可能需要將這些照片以文件形式導出&#xff0c;以便與他人共享、打印或備份。無論您是要將照片發送給朋友、上傳到社交媒體&#xff0c;還是保存到外部存儲設備&#xff0c;導出照片為文件是…

我的Python教程:使用Pyecharts畫柱狀圖

Pyecharts是一個用于生成 Echarts 圖表的 Python 庫。Echarts 是一個基于 JavaScript 的數據可視化庫&#xff0c;提供了豐富的圖表類型和交互功能。通過 Pyecharts&#xff0c;你可以使用 Python 代碼生成各種類型的 Echarts 圖表&#xff0c;例如折線圖、柱狀圖、餅圖、散點圖…

java不支持解壓rar5的解決辦法--引用本地7zip.exe

由于rar5算法未開源&#xff0c;沒有合適的JAVA依賴能夠解決解壓rar5。在運行中報錯&#xff1a; javacom.github.junrar.exception.RarException: badRarArchive 通過引用本地7zip.exe&#xff0c;命令行執行解決&#xff1a; private static void unZipRar5File(String fileP…

探索可視化應用的嶄新前景

在當今數據驅動的世界中&#xff0c;可視化應用成為了一種強大的工具&#xff0c;能夠將復雜的數據轉化為易于理解和分析的圖形形式。隨著技術的不斷發展和創新&#xff0c;可視化應用正迎來嶄新的前景。本文將介紹可視化應用的定義、重要性以及當前的發展趨勢&#xff0c;并探…

Controller是單例還是多例?

Controller是單例還是多例&#xff1f; controller默認是單例的&#xff0c;不要使用非靜態的成員變量&#xff0c;否則會發生數據邏輯混亂。正因為單例所以不是線程安全的。 我們下面來簡單的驗證下&#xff1a; package com.riemann.springbootdemo.controller;import org…

docker配置文件

/etc/docker/daemon.json 文件作用 /etc/docker/daemon.json 文件是 Docker 配置文件&#xff0c;用于配置 Docker 守護進程的行為和參數。Docker 守護進程是負責管理和運行 Docker 容器的后臺進程&#xff0c;通過修改 daemon.json 文件&#xff0c;可以對 Docker 守護進程進…

不做Linux就沒前途嗎?

答案當然是——并不會 我晚上回來的時候跟一個今年的畢業生聊天&#xff0c;他入職了一家公司&#xff0c;但是從事的不是Linux相關的工作。 我這里想說的是&#xff0c;做Linux可以賺錢&#xff0c;Linux現在是全世界最牛逼的開源項目一點都不為過&#xff0c;但是Linux也不是…

NLP(六十五)LangChain中的重連(retry)機制

關于LangChain入門&#xff0c;讀者可參考文章NLP&#xff08;五十六&#xff09;LangChain入門 。 ??本文將會介紹LangChain中的重連機制&#xff0c;并嘗試給出定制化重連方案。 ??本文以LangChain中的對話功能&#xff08;ChatOpenAI&#xff09;為例。 LangChain中的重…

【Mysql】數據庫基礎與基本操作

&#x1f307;個人主頁&#xff1a;平凡的小蘇 &#x1f4da;學習格言&#xff1a;命運給你一個低的起點&#xff0c;是想看你精彩的翻盤&#xff0c;而不是讓你自甘墮落&#xff0c;腳下的路雖然難走&#xff0c;但我還能走&#xff0c;比起向陽而生&#xff0c;我更想嘗試逆風…