摘要:代碼先找到第一個(gè)節(jié)點(diǎn),并把路徑入棧棧為空時(shí)不再有下一個(gè)棧頂是待返回元素如果該元素有右節(jié)點(diǎn),把它的右節(jié)點(diǎn)及右節(jié)點(diǎn)的所有左邊節(jié)點(diǎn)都?jí)喝霔V?/p>
Binary Search Tree Iterator 最新更新:https://yanjia.me/zh/2019/02/...
Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the root node of a BST.棧法 復(fù)雜度Calling next() will return the next smallest number in the BST.
Note: next() and hasNext() should run in average O(1) time and uses O(h) memory, where h is the height of the tree.
時(shí)間 O(N) 空間 O(1)
思路這道題和Inorder Successor in BST很像,區(qū)別在于Successor那題是給定節(jié)點(diǎn)求下一個(gè),而這題是要做一個(gè)迭代器,返回當(dāng)前指向的值,其實(shí)就是求上次返回的節(jié)點(diǎn)的下一個(gè),本質(zhì)是一樣的。題目要求最多只能用O(H)的空間,所以思路也和那題一樣,用一個(gè)Stack記錄從根節(jié)點(diǎn)到當(dāng)前節(jié)點(diǎn)的路徑。next的時(shí)候就返回Stack最上面的元素。不過(guò)拿出最上面的元素后,我們還要看一下這個(gè)被返回的元素是否有右節(jié)點(diǎn),如果有的話,就把它的右節(jié)點(diǎn)及右節(jié)點(diǎn)的所有左邊節(jié)點(diǎn)都?jí)喝霔V?。另外,初始化棧時(shí),我們要找到最左邊的節(jié)點(diǎn),也就是中序遍歷的第一個(gè)節(jié)點(diǎn),并把根到第一個(gè)節(jié)點(diǎn)的路徑都?jí)喝霔!?/p>
這題還可以結(jié)合Binary Tree Inorder Traverse的迭代做法一起理解。他們的共同點(diǎn)都是用一個(gè)棧,將最左邊的節(jié)點(diǎn)都?jí)喝霔!?/p> 代碼
public class BSTIterator { Stackstk; public BSTIterator(TreeNode root) { stk = new Stack (); // 先找到第一個(gè)節(jié)點(diǎn),并把路徑入棧 while(root != null){ stk.push(root); root = root.left; } } public boolean hasNext() { // 棧為空時(shí)不再有下一個(gè) return !stk.isEmpty(); } public int next() { // 棧頂是待返回元素 TreeNode curr = stk.pop(); int res = curr.val; // 如果該元素有右節(jié)點(diǎn),把它的右節(jié)點(diǎn)及右節(jié)點(diǎn)的所有左邊節(jié)點(diǎn)都?jí)喝霔V? if(curr.right != null){ curr = curr.right; while(curr != null){ stk.push(curr); curr = curr.left; } } return res; } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64580.html
摘要:解題思路對(duì)于二叉搜索樹,我們很容易會(huì)想到使用棧和隊(duì)列來(lái)解決問(wèn)題,本題是要求實(shí)現(xiàn)一個(gè)對(duì)二叉搜索樹的遍歷器,要求每次可以返回最小的節(jié)點(diǎn)值,我們使用棧。 Binary Search Tree IteratorImplement an iterator over a binary search tree (BST). Your iterator will be initialized with...
摘要:遞歸法復(fù)雜度時(shí)間空間思路根據(jù)二叉樹的性質(zhì),我們知道當(dāng)遍歷到某個(gè)根節(jié)點(diǎn)時(shí),最近的那個(gè)節(jié)點(diǎn)要么是在子樹里面,要么就是根節(jié)點(diǎn)本身。因?yàn)槲覀冎离x目標(biāo)數(shù)最接近的數(shù)肯定在二叉搜索的路徑上。 Closest Binary Search Tree Value I Given a non-empty binary search tree and a target value, find the va...
摘要:在線網(wǎng)站地址我的微信公眾號(hào)完整題目列表從年月日起,每天更新一題,順序從易到難,目前已更新個(gè)題。這是項(xiàng)目地址歡迎一起交流學(xué)習(xí)。 這篇文章記錄我練習(xí)的 LeetCode 題目,語(yǔ)言 JavaScript。 在線網(wǎng)站:https://cattle.w3fun.com GitHub 地址:https://github.com/swpuLeo/ca...我的微信公眾號(hào): showImg(htt...
摘要:題目地址嗯,經(jīng)典的題目,中序遍歷二叉樹。代碼如下中序遍歷先序遍歷后序遍歷是不是簡(jiǎn)單的不要不要的,遞歸就是這么美。右孩子后壓棧全部釋放出來(lái)嗯,總的來(lái)說(shuō)用迭代遍歷確實(shí)燒腦,沒(méi)什么性能上的特殊需求還是用遞歸寫法吧,對(duì)程序員友好哦。 94. Binary Tree Inorder Traversal Given a binary tree, return the inorder travers...
摘要:注意這里的結(jié)構(gòu)和不同的二叉樹遍歷一樣,如果到空節(jié)點(diǎn)就返回,否則遞歸遍歷左節(jié)點(diǎn)和右節(jié)點(diǎn)。唯一不同是加入了和,所以要在遞歸之前先判斷是否符合和的條件。代碼如果該節(jié)點(diǎn)大于上限返回假如果該節(jié)點(diǎn)小于下限返回假遞歸判斷左子樹和右子樹 Validate Binary Search Tree Given a binary tree, determine if it is a valid binary...
閱讀 975·2021-11-24 09:39
閱讀 3402·2021-10-27 14:20
閱讀 2328·2019-08-30 14:08
閱讀 3370·2019-08-29 16:34
閱讀 2185·2019-08-26 12:14
閱讀 2112·2019-08-26 11:54
閱讀 2780·2019-08-26 11:44
閱讀 2485·2019-08-26 11:38