在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

怎么就能構造成二叉樹呢?

算法與數據結構 ? 來源:代碼隨想錄 ? 作者:代碼隨想錄 ? 2022-07-14 11:20 ? 次閱讀
經常有錄友問,二叉樹的題目中輸入用例,在ACM模式下應該怎么構造呢?

力扣上的題目,輸入用例就給了一個數組,怎么就能構造成二叉樹呢?

這次就給大家好好講一講!

就拿最近公眾號上 二叉樹的打卡題目來說:

538.把二叉搜索樹轉換為累加樹

其輸入用例,就是用一個數組來表述 二叉樹,如下:

768cf948-0323-11ed-ba43-dac502259ad0.png

一直跟著公眾號學算法的錄友 應該知道,我在二叉樹:構造二叉樹登場!,已經講過,只有 中序與后序 和 中序和前序 可以確定一顆唯一的二叉樹。前序和后序是不能確定唯一的二叉樹的

那么538.把二叉搜索樹轉換為累加樹的示例中,為什么,一個序列(數組或者是字符串)就可以確定二叉樹了呢?

很明顯,是后臺直接明確了構造規則。

再看一下 這個 輸入序列 和 對應的二叉樹。768cf948-0323-11ed-ba43-dac502259ad0.png

從二叉樹 推導到 序列,大家可以發現這就是層序遍歷。

但從序列 推導到 二叉樹,很多同學就看不懂了,這得怎么轉換呢。

我在關于二叉樹,你該了解這些!已經詳細講過,二叉樹可以有兩種存儲方式,一種是 鏈式存儲,另一種是順序存儲。

鏈式存儲,就是大家熟悉的二叉樹,用指針指向左右孩子。

順序存儲,就是用一個數組來存二叉樹,其方式如圖所示:

76b93ed6-0323-11ed-ba43-dac502259ad0.png

那么此時大家是不是應該知道了,數組如何轉化成 二叉樹了。如果父節點的數組下標是i,那么它的左孩子下標就是i * 2 + 1,右孩子下標就是 i * 2 + 2

那么這里又有同學疑惑了,這些我都懂了,但我還是不知道 應該 怎么構造。

來,咱上代碼。昨天晚上 速度敲了一遍實現代碼。

具體過程看注釋:

//根據數組構造二叉樹
TreeNode*construct_binary_tree(constvector<int>&vec){
vectorvecTree(vec.size(),NULL);
TreeNode*root=NULL;
//把輸入數值數組,先轉化為二叉樹節點數組
for(inti=0;iNULL;
if(vec[i]!=-1)node=newTreeNode(vec[i]);//數組中用-1表示null
vecTree[i]=node;
if(i==0)root=node;
}
//遍歷一遍,根據規則左右孩子賦值就可以了
//注意這里結束規則是i*2+2
for(inti=0;i*2+2if(vecTree[i]!=NULL){
//線性存儲轉連式存儲關鍵邏輯
vecTree[i]->left=vecTree[i*2+1];
vecTree[i]->right=vecTree[i*2+2];
}
}
returnroot;
}

這個函數最后返回的 指針就是 根節點的指針, 這就是 傳入二叉樹的格式了,也就是 力扣上的用例輸入格式,如圖:

76cd1ece-0323-11ed-ba43-dac502259ad0.png

也有不少同學在做ACM模式的題目,就經常疑惑:

  • 讓我傳入數值,我會!
  • 讓我傳入數組,我會!
  • 讓我傳入鏈表,我也會!
  • 讓我傳入二叉樹,我懵了,啥?傳入二叉樹?二叉樹怎么傳?

其實傳入二叉樹,就是傳入二叉樹的根節點的指針,和傳入鏈表都是一個邏輯。

這種現象主要就是大家對ACM模式過于陌生,說實話,ACM模式才真正的考察代碼能力(注意不是算法能力),而 力扣的核心代碼模式 總有一種 不夠徹底的感覺。

所以,如果大家對ACM模式不夠了解,一定要多去練習!

那么以上的代碼,我們根據數組構造二叉樹,接來下我們在 把 這個二叉樹打印出來,看看是不是 我們輸入的二叉樹結構,這里就用到了層序遍歷,我們在二叉樹:層序遍歷登場!中講過。

完整測試代碼如下:

#include
#include
#include
usingnamespacestd;

structTreeNode{
intval;
TreeNode*left;
TreeNode*right;
TreeNode(intx):val(x),left(NULL),right(NULL){}
};

//根據數組構造二叉樹
TreeNode*construct_binary_tree(constvector<int>&vec){
vectorvecTree(vec.size(),NULL);
TreeNode*root=NULL;
for(inti=0;iNULL;
if(vec[i]!=-1)node=newTreeNode(vec[i]);
vecTree[i]=node;
if(i==0)root=node;
}
for(inti=0;i*2+2if(vecTree[i]!=NULL){
vecTree[i]->left=vecTree[i*2+1];
vecTree[i]->right=vecTree[i*2+2];
}
}
returnroot;
}

//層序打印打印二叉樹
voidprint_binary_tree(TreeNode*root){
queueque;
if(root!=NULL)que.push(root);
vector<vector<int>>result;
while(!que.empty()){
intsize=que.size();
vector<int>vec;
for(inti=0;iif(node!=NULL){
vec.push_back(node->val);
que.push(node->left);
que.push(node->right);
}
//這里的處理邏輯是為了把null節點打印出來,用-1表示null
elsevec.push_back(-1);
}
result.push_back(vec);
}
for(inti=0;ifor(intj=0;jcout<"";
}
cout<endl;
}
}

intmain(){
//注意本代碼沒有考慮輸入異常數據的情況
//用-1來表示null
vector<int>vec={4,1,6,0,2,5,7,-1,-1,-1,3,-1,-1,-1,8};
TreeNode*root=construct_binary_tree(vec);
print_binary_tree(root);
}

可以看出我們傳入的數組是:{4,1,6,0,2,5,7,-1,-1,-1,3,-1,-1,-1,8} , 這里是用 -1 來表示null,

538.把二叉搜索樹轉換為累加樹中的輸入是一樣的

768cf948-0323-11ed-ba43-dac502259ad0.png

這里可能又有同學疑惑,你這不一樣啊,題目是null,你為啥用-1。

用-1 表示null為了方便舉例,如果非要和 力扣輸入一樣一樣的,就是簡單的字符串處理,把null 替換為 -1 就行了。

在來看,測試代碼輸出的效果:

76ef3fae-0323-11ed-ba43-dac502259ad0.png

可以看出和 題目中輸入用例 這個圖 是一樣一樣的。只不過題目中圖沒有把 空節點 畫出來而已。

7747e866-0323-11ed-ba43-dac502259ad0.png

大家可以拿我的代碼去測試一下,跑一跑。

注意:我的測試代碼,并沒有處理輸入異常的情況(例如輸入空數組之類的),處理各種輸入異常,大家可以自己去練練

審核編輯 :李倩


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

    關注

    0

    文章

    74

    瀏覽量

    12325
  • 數組
    +關注

    關注

    1

    文章

    417

    瀏覽量

    25947

原文標題:不懂就問!

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

收藏 人收藏

    評論

    相關推薦

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

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

    用PCM2904做的聲卡,造成波形失真的原因是什么

    請教一下造成波形失真的原因是什么, 這是我用PCM2904做的聲卡,輸出信號并連到輸入,測試正弦波無失真,三角波無失真,但方波和鋸齒波有失真,不知是信號 通路中什么原因造成
    發表于 09-14 09:25

    誤差放大器內部構造

    誤差放大器作為一種關鍵的電子元件,在電子測量、控制系統以及電源管理等領域發揮著重要作用。其內部構造雖然因具體設計而異,但大體上可以歸納為幾個核心部分:偏置電路、輸入級、增益級和輸出級。以下是對誤差放大器內部構造的詳細解析。
    的頭像 發表于 09-11 15:33 ?665次閱讀

    工控一體機構造及可能會發生的問題

    大家或許都對工業平板電腦有所耳聞,那么,對于它的主要構造部分,我們又了解多少?熟悉這些部件,有助于我們在設備出現故障時,迅速定位問題所在。
    的頭像 發表于 08-25 16:52 ?1014次閱讀

    TLV3502的輸出電壓無法輸出到低電平,是什么問題造成

    您好,想咨詢一下TLV3502的輸出電壓無法輸出到低電平,這種是什么問題造成? 電路原理圖如下
    發表于 07-29 07:27

    指電極上覆蓋敏感材料的阻值計算

    覆蓋的敏感材料厚度超出指厚度時計算電阻,是否可以視作指電極指間電阻多個周期串聯后與超出指厚度部分敏感材料電阻并聯
    發表于 07-05 14:48

    指MOSFET器件靜電防護魯棒性提升技巧

    柵極接地NMOS是一種廣泛應用的片上ESD器件結構,為達到特定ESD防護等級,一般會采用多指版圖形式來減小器件占用的芯片面積。但是,多指柵極接地NMOS在ESD應力作用下,各個指難于做到均勻
    的頭像 發表于 06-22 00:50 ?525次閱讀
    多<b class='flag-5'>叉</b>指MOSFET器件靜電防護魯棒性提升技巧

    為什么LT1931電容接輸出不接地就能軟啟動

    看錯了,軟啟動電容的另一端應該接負電源輸出,而我接了地了,后續修改了電路,軟啟動有效果了,我測量了軟啟動過程的EN腳,波形如下 那我就很疑惑: 1、為什么電容接輸出不接地就能軟啟動?那EN引腳的波形又怎么解釋,怎么還分段
    發表于 06-03 08:10

    原理圖設計里兩顆重要的(國產EDA)

    原理圖里面兩顆重要的,那就是元件和網絡,作為EDA工具中的重要視圖和概念,雖然看似枯燥,但它們扮演著非常重要的角色,它們為電路圖的層次化結構提供了有力支撐。想象一個大型的電路設計項目,就像一個
    的頭像 發表于 05-29 17:47 ?754次閱讀
    原理圖設計里兩顆重要的<b class='flag-5'>樹</b>(國產EDA)

    時鐘的圖好像是APB的時鐘都是AHB給的,請問這些時鐘為多少是哪兒配的?是sysinit里嗎?

    大家好,我看時鐘的圖好像是APB的時鐘都是AHB給的,請問這些時鐘為多少是哪兒配的?是sysinit里嗎?
    發表于 05-11 07:34

    圣誕燈電路圖分享

    圣誕裝飾的電路分為兩個主要部分,即燈光和聲音部分。照明部分由五組 LED 組成,它們以進制順序運行,每隔幾分鐘就會重復一次。在這里,根據我們的興趣,LED 可以是任何顏色。這件裝飾品可以裝飾您的圣誕以及您的家。
    的頭像 發表于 05-05 10:12 ?1059次閱讀
    圣誕<b class='flag-5'>樹</b>燈電路圖分享

    集線器是什么?集線器內部構造

    集線器內部采用了電器互聯,當維護LAN的環境是邏輯總線或環型結構時,完全可以用集線器建立一個物理上的星型或型網絡結構。
    的頭像 發表于 03-22 15:22 ?3864次閱讀
    集線器是什么?集線器內部<b class='flag-5'>構造</b>

    串聯的總線舵機是不是只用一個UART接口就能控制

    串聯的總線舵機是不是只用一個UART接口就能控制
    發表于 03-07 06:30

    哈夫曼編碼怎么算 哈夫曼編碼左邊是0還是1

    二叉樹,將出現頻率高的字符用較短的編碼表示,而出現頻率低的字符則用較長的編碼表示。通過這種方式,可以實現對數據進行高效的編碼和解碼。 下面我們將詳細介紹哈夫曼編碼的算法過程。 統計字符頻率 在進行哈夫曼編碼前,首先需
    的頭像 發表于 01-30 11:27 ?2966次閱讀

    如何選擇各種特性的極管

    如何選擇各種特性的極管? 在實際設計中,極管是一種非常常見的電子器件。它具有許多特性和參數,如正向電壓降、反向電壓耐受能力、電流容許值、開關速度等。選擇適合的極管對于實際電路的
    的頭像 發表于 01-12 11:18 ?558次閱讀
    主站蜘蛛池模板: 韩国三级精品| 午夜视频福利| 天天干天天操天天透| 欧美激情亚洲精品日韩1区2区| 国产成人综合一区人人| 免费观看美女被cao视频| 糖心vlog麻豆精东影业传媒| 色综合狠狠| 国产成人精品亚洲| se综合| 婷婷色在线播放| 国产精品一区二区三区四区 | 成人夜色香网站在线观看| 1区2区3区| 久草免费在线播放| 久久国产精品99久久久久久牛牛 | 色婷婷精品| 91久久青草精品38国产 | 婷婷激情在线| 欧美视频精品一区二区三区| 午夜国产视频| 免费在线观看一区二区| 女人色视频| 日日搞夜夜操| 综合色99| 国产精品入口免费视频| 视频在线观看h| 色偷偷免费视频| 天天干夜夜操视频| 很黄很污的视频网站| 激情天堂| 77ee成人| 日本三级三级三级免费看| 色图插插插| 永久免费的拍拍拍网站| 成年网站在线在免费播放| 国产成人啪精品午夜在线播放| 色五月婷婷成人网| 天天操国产| 亚洲三级电影| 亚洲午夜网|