女人荫蒂被添全过程13种图片,亚洲+欧美+在线,欧洲精品无码一区二区三区 ,在厨房拨开内裤进入毛片

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

二叉樹的前序遍歷非遞歸實現

算法與數據結構 ? 來源:袁廚的算法小屋 ? 作者:袁廚的算法小屋 ? 2021-05-28 13:59 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

我們之前說了二叉樹基礎及二叉的幾種遍歷方式及練習題,今天我們來看一下二叉樹的前序遍歷非遞歸實現。

前序遍歷的順序是, 對于樹中的某節點,先遍歷該節點,然后再遍歷其左子樹,最后遍歷其右子樹。

我們先來通過下面這個動畫復習一下二叉樹的前序遍歷。

迭代遍歷

我們試想一下,之前我們借助隊列幫我們實現二叉樹的層序遍歷,

那么可不可以,也借助數據結構,幫助我們實現二叉樹的前序遍歷。

假設我們的二叉樹為 [1,2,3]。我們需要對其進行前序遍歷。其遍歷順序為

當前節點 1,左孩子 2,右孩子 3。

這里可不可以用棧,幫我們完成前序遍歷呢?

棧和隊列的那些事

我們都知道棧的特性是先進后出,我們借助棧來幫助我們完成前序遍歷的時候。

則需要注意的一點是,我們應該先將右子節點入棧,再將左子節點入棧。

這樣出棧時,則會先出左節點,再出右子節點,則能夠完成樹的前序遍歷。

我們用一句話對上圖進行總結,當棧不為空時,棧頂元素出棧,如果其右孩子不為空,則右孩子入棧,其左孩子不為空,則左孩子入棧。還有一點需要注意的是,我們和層序遍歷一樣,需要先將 root 節點進行入棧,然后再執行 while 循環。

看到這里你已經能夠自己編寫出代碼了,不信你去試試。

時間復雜度:O(n) 需要對所有節點遍歷一次

空間復雜度:O(n) 棧的開銷,平均為 O(logn) 最快情況,即斜二叉樹時為 O(n)

參考代碼

class Solution {

public List《Integer》 preorderTraversal(TreeNode root) {

List《Integer》 list = new ArrayList《》();

Stack《TreeNode》 stack = new Stack《》();

if (root == null) return list;

stack.push(root);

while (!stack.isEmpty()) {

TreeNode temp = stack.pop();

if (temp.right != null) {

stack.push(temp.right);

}

if (temp.left != null) {

stack.push(temp.left);

}

//這里也可以放到前面

list.add(temp.val);

}

return list;

}

}

Morris

Morris 遍歷利用樹的左右孩子為空(大量空閑指針),實現空間開銷的極限縮減。這個遍歷方式,稍微有那么一丟丟難理解,不過結合動圖,也就一目了然,下面我們先看動畫吧。

看完視頻,是不是感覺自己搞懂了,又感覺自己沒搞懂,哈哈,咱們繼續往下看。

我們之前說的,Morris 遍歷利用了樹中大量空閑指針的特性,我們需要找到當前節點的左子樹中的最右邊的葉子節點,將該葉子節點的 right 指向當前節點。例如當前節點為2,其左子樹中的最右節點為 9 ,則在 9 節點添加一個 right 指針指向 2。

其實上圖中的 Morris 遍歷遵循兩個原則,我們在動畫中也能夠得出。

1.當 p1.left == null 時,p1 = p1.right。(這也就是我們為什么要給葉子節點添加 right 指針的原因)

2.如果 p1.left != null,找到 p1 左子樹上最右的節點。(也就是我們的 p2 最后停留的位置),此時我們又可以分為兩種情況,一種是葉子節點添加 right 指針的情況,一種是去除葉子節點 right 指針的情況。

如果 p2 的 right 指針指向空,讓其指向 p1,p1向左移動,即 p1 = p1.left

如果 p2 的 right 指針指向 p1,讓其指向空,(為了防止重復執行,則需要去掉 right 指針)p1 向右移動,p1 = p1.right。

這時你可以結合咱們剛才提到的兩個原則,再去看一遍動畫,并代入規則進行模擬,差不多就能完全搞懂啦。

下面我們來對動畫中的內容進行拆解

首先 p1 指向 root節點

p2 = p1.left,下面我們需要通過 p2 找到 p1的左子樹中的最右節點。即節點 5,然后將該節點的 right 指針指向 root。并記錄 root 節點的值。

向左移動 p1,即 p1 = p1.left

p2 = p1.left ,即節點 4 ,找到 p1 的左子樹中的最右葉子節點,也就是 9,并將該節點的 right 指針指向 2。

繼續向左移動 p1,即 p1 = p1.left,p2 = p1.left。也就是節點 8。并將該節點的 right 指針指向 p1。

我們發現這一步給前兩步是一樣的,都是找到葉子節點,將其 right 指針指向 p1,此時我們完成了添加 right 指針的過程,下面我們繼續往下看。

我們繼續移動 p1 指針,p1 = p1.left。p2 = p.left。此時我們發現 p2 == null,即下圖此時我們需要移動 p1, 但是不再是 p1 = p1.left 而是 p1 = p1.right。也就是 4,繼續讓 p2 = p1.left。此時則為下圖這種情況

此時我們發現 p2.right != null 而是指向 4,說明此時我們已經添加過了 right 指針,所以去掉 right 指針,并讓 p1 = p1.right

下面則繼續移動 p1 ,按照規則繼續移動即可,遇到的情況已經在上面做出了舉例,所以下面我們就不繼續贅述啦,如果還不是特別理解的同學,可以再去看一遍動畫加深下印象。時間復雜度 O(n),空間復雜度 O(1)下面我們來看代碼吧。

代碼

class Solution {

public List《Integer》 preorderTraversal(TreeNode root) {

List《Integer》 list = new ArrayList《》();

if (root == null) {

return list;

}

TreeNode p1 = root; TreeNode p2 = null;

while (p1 != null) {

p2 = p1.left;

if (p2 != null) {

//找到左子樹的最右葉子節點

while (p2.right != null && p2.right != p1) {

p2 = p2.right;

}

//添加 right 指針,對應 right 指針為 null 的情況

if (p2.right == null) {

list.add(p1.val);

p2.right = p1;

p1 = p1.left;

continue;

}

//對應 right 指針存在的情況,則去掉 right 指針

p2.right = null;

} else {

list.add(p1.val);

}

//移動 p1

p1 = p1.right;

}

return list;

}

}

原文標題:把二叉樹揉碎(二)

文章出處:【微信公眾號:算法與數據結構】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 二叉樹
    +關注

    關注

    0

    文章

    74

    瀏覽量

    12613

原文標題:把二叉樹揉碎(二)

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數據結構】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    想在rtsmart中使用uart2,是不是只能通過修改設備方法來實現uart2的復用呀?

    我想在rtsmart中使用uart2,是不是只能通過修改設備方法來實現uart2的復用呀? 修改設備后如何只編譯設備文件? 編譯生成的文件可以直接替換到廬山派里嗎,具體替換路徑在
    發表于 06-24 07:04

    機器人看點:宇科技王興興回上海母校 加速商業化落地 宇機器人手租賃火爆

    給大家帶來一些機器人的消息: 宇科技王興興回上海母校 加速商業化落地 日前,宇科技創始人王興興在接受媒體專訪時候,介紹了公司的H1人形機器人的技術亮點及行業前景,H1人形機器人是首款能原地后翻出
    的頭像 發表于 02-25 11:26 ?1396次閱讀

    求解答,設備問題

    請問,rk3588j要再提取一個USB3.0接口設備怎么改
    發表于 02-20 11:22

    科技在物聯網方面

    據傳輸的需求。例如,利用5G的低延遲、高帶寬特性,實現機器人與云端服務器之間的快速數據傳輸,提高機器人的響應速度和智能化水平。 智能決策與數據分析 邊緣計算與云計算結合:宇科技的機器人采用了邊緣
    發表于 02-04 06:48

    嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-初識設備之設備組成和結構

    的name和value。在設備中,可描述的信息包括:一、CPU的數量和類別;、內存基地址和大小;三、總線和橋;四、外設連接;五、中斷控制器和中斷使用情況;六、GPIO控制器和GPIO使用情況;七
    發表于 01-08 08:32

    字符串反轉的實現方式

    在編程中,字符串反轉是一個基礎而重要的操作,它涉及到將一個字符串中的字符順序顛倒過來。這個操作在多種編程語言中都有不同的實現方式,本文將探討幾種常見的字符串反轉方法。 1. 遞歸方法 遞歸是一種通過
    的頭像 發表于 01-07 15:27 ?796次閱讀

    飛凌嵌入式ElfBoard ELF 1板卡-初識設備之設備組成和結構

    的name和value。在設備中,可描述的信息包括:一、CPU的數量和類別;、內存基地址和大小;三、總線和橋;四、外設連接;五、中斷控制器和中斷使用情況;六、GPIO控制器和GPIO使用情況;七
    發表于 01-07 09:16

    ATA-2041高壓放大器在指形電極管狀壓電元件電極制備中的應用

    實驗名稱:指形電極管狀壓電元件電極制備與極化研究 測試目的:目前,已有學者對指形電極的管狀壓電元件進行了一系列研究,通過靜力學方程完成理論推導,建立有限元分析模型,對該壓電元件的靜態驅動性能
    的頭像 發表于 12-25 11:26 ?521次閱讀
    ATA-2041高壓放大器在<b class='flag-5'>叉</b>指形電極管狀壓電元件電極制備中的應用

    dp接口的最新技術發展

    深度優先搜索(DFS)是一種基本的算法,用于遍歷或搜索或圖。它從一個頂點開始,盡可能深地搜索的分支。當搜索到最深節點時,然后回溯。DFS可以用于解決許多問題,如尋找路徑、檢測循環、拓撲排序等
    的頭像 發表于 10-30 13:52 ?558次閱讀

    鐳神智能機器人三向式3D SLAM無人叉車:重塑高位堆垛與窄通道倉儲新境界

    °旋轉左右取的卓越性能,解鎖更多高位密集倉儲場景應用。5m高位堆垛,挑戰倉儲新高度LXK12-B無人叉車憑借其強大的舉升能力,能夠輕松實現高達5m的高位堆垛,極大地
    的頭像 發表于 10-26 08:03 ?596次閱讀
    鐳神智能機器人三向<b class='flag-5'>叉</b>式3D SLAM無人叉車:重塑高位堆垛與窄通道倉儲新境界

    什么是默克爾(Merkle Tree)?如何計算默克爾根?

    01 默克爾的概念 默克爾(Merkle Tree)是一種特殊的二叉樹,它的每個節點都存儲了一個數據塊的哈希值。哈希值是一種可以將任意長度的數據轉換為固定長度的字符串的算法,它具有唯一性和不可
    的頭像 發表于 09-30 18:22 ?2221次閱讀
    什么是默克爾<b class='flag-5'>樹</b>(Merkle Tree)?如何計算默克爾根?

    【北京迅為】iTOP-i.MX6開發板使用手冊第四部分固件編譯第十四章設備Android4.4系統編譯

    【北京迅為】iTOP-i.MX6開發板使用手冊第四部分固件編譯第十四章設備Android4.4系統編譯
    的頭像 發表于 09-12 15:43 ?893次閱讀
    【北京迅為】iTOP-i.MX6開發板使用手冊第四部分固件編譯第十四章<b class='flag-5'>非</b>設備<b class='flag-5'>樹</b>Android4.4系統編譯

    Python遞歸的經典案例

    當我們碰到諸如需要求階乘或斐波那契數列的問題時,使用普通的循環往往比較麻煩,但如果我們使用遞歸時,會簡單許多,起到事半功倍的效果。這篇文章主要和大家分享一些和遞歸有關的經典案例,結合一些資料談一下個人的理解,也借此加深自己對遞歸
    的頭像 發表于 08-05 15:57 ?702次閱讀

    遞歸神經網絡和循環神經網絡的模型結構

    遞歸神經網絡是一種旨在處理分層結構的神經網絡,使其特別適合涉及樹狀或嵌套數據的任務。這些網絡明確地模擬了層次結構中的關系和依賴關系,例如語言中的句法結構或圖像中的層次表示。它使用遞歸操作來分層處理信息,有效地捕獲上下文信息。
    的頭像 發表于 07-10 17:21 ?1258次閱讀
    <b class='flag-5'>遞歸</b>神經網絡和循環神經網絡的模型結構

    遞歸神經網絡的實現方法

    (Recurrent Neural Network,通常也簡稱為RNN,但在此處為區分,我們將循環神經網絡稱為Recurrent RNN)不同,遞歸神經網絡更側重于處理樹狀或圖結構的數據,如句法分析、自然語言的語法結構等。以下將從遞歸
    的頭像 發表于 07-10 17:02 ?766次閱讀
    主站蜘蛛池模板: 嘉义县| 漯河市| 巩义市| 治县。| 都江堰市| 阿拉尔市| 盈江县| 佛坪县| 扎鲁特旗| 郸城县| 晋城| 安丘市| 施甸县| 平凉市| 武安市| 林西县| 墨脱县| 乌苏市| 北碚区| 德化县| 新余市| 成武县| 湖南省| 温泉县| 维西| 门头沟区| 临西县| 海伦市| 富裕县| 隆化县| 施秉县| 彭州市| 兰西县| 色达县| 阳东县| 安乡县| 湖州市| 鄂托克前旗| 神池县| 北辰区| 大邑县|