0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

怎么就能構(gòu)造成二叉樹呢?

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

力扣上的題目,輸入用例就給了一個(gè)數(shù)組,怎么就能構(gòu)造成二叉樹呢?

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

就拿最近公眾號(hào)上 二叉樹的打卡題目來說:

538.把二叉搜索樹轉(zhuǎn)換為累加樹

其輸入用例,就是用一個(gè)數(shù)組來表述 二叉樹,如下:

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

一直跟著公眾號(hào)學(xué)算法的錄友 應(yīng)該知道,我在二叉樹:構(gòu)造二叉樹登場(chǎng)!,已經(jīng)講過,只有 中序與后序 和 中序和前序 可以確定一顆唯一的二叉樹。前序和后序是不能確定唯一的二叉樹的

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

很明顯,是后臺(tái)直接明確了構(gòu)造規(guī)則。

再看一下 這個(gè) 輸入序列 和 對(duì)應(yīng)的二叉樹。768cf948-0323-11ed-ba43-dac502259ad0.png

從二叉樹 推導(dǎo)到 序列,大家可以發(fā)現(xiàn)這就是層序遍歷。

但從序列 推導(dǎo)到 二叉樹,很多同學(xué)就看不懂了,這得怎么轉(zhuǎn)換呢。

我在關(guān)于二叉樹,你該了解這些!已經(jīng)詳細(xì)講過,二叉樹可以有兩種存儲(chǔ)方式,一種是 鏈?zhǔn)酱鎯?chǔ),另一種是順序存儲(chǔ)。

鏈?zhǔn)酱鎯?chǔ),就是大家熟悉的二叉樹,用指針指向左右孩子。

順序存儲(chǔ),就是用一個(gè)數(shù)組來存二叉樹,其方式如圖所示:

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

那么此時(shí)大家是不是應(yīng)該知道了,數(shù)組如何轉(zhuǎn)化成 二叉樹了。如果父節(jié)點(diǎn)的數(shù)組下標(biāo)是i,那么它的左孩子下標(biāo)就是i * 2 + 1,右孩子下標(biāo)就是 i * 2 + 2。

那么這里又有同學(xué)疑惑了,這些我都懂了,但我還是不知道 應(yīng)該 怎么構(gòu)造。

來,咱上代碼。昨天晚上 速度敲了一遍實(shí)現(xiàn)代碼。

具體過程看注釋:

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

這個(gè)函數(shù)最后返回的 指針就是 根節(jié)點(diǎn)的指針, 這就是 傳入二叉樹的格式了,也就是 力扣上的用例輸入格式,如圖:

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

也有不少同學(xué)在做ACM模式的題目,就經(jīng)常疑惑:

  • 讓我傳入數(shù)值,我會(huì)!
  • 讓我傳入數(shù)組,我會(huì)!
  • 讓我傳入鏈表,我也會(huì)!
  • 讓我傳入二叉樹,我懵了,啥?傳入二叉樹?二叉樹怎么傳?

其實(shí)傳入二叉樹,就是傳入二叉樹的根節(jié)點(diǎn)的指針,和傳入鏈表都是一個(gè)邏輯。

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

所以,如果大家對(duì)ACM模式不夠了解,一定要多去練習(xí)!

那么以上的代碼,我們根據(jù)數(shù)組構(gòu)造二叉樹,接來下我們?cè)?把 這個(gè)二叉樹打印出來,看看是不是 我們輸入的二叉樹結(jié)構(gòu),這里就用到了層序遍歷,我們?cè)?a href="http://srfitnesspt.com/outside?redirect=https://mp.weixin.qq.com/s?__biz=MzUxNjY5NTYxNA==&mid=2247491416&idx=1&sn=1a99afc9cb150f889f8005e0cc63c5fe&scene=21#wechat_redirect" target="_blank">二叉樹:層序遍歷登場(chǎng)!中講過。

完整測(cè)試代碼如下:

#include
#include
#include
usingnamespacestd;

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

//根據(jù)數(shù)組構(gòu)造二叉樹
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節(jié)點(diǎn)打印出來,用-1表示null
elsevec.push_back(-1);
}
result.push_back(vec);
}
for(inti=0;ifor(intj=0;jcout<"";
}
cout<endl;
}
}

intmain(){
//注意本代碼沒有考慮輸入異常數(shù)據(jù)的情況
//用-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);
}

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

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

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

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

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

在來看,測(cè)試代碼輸出的效果:

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

可以看出和 題目中輸入用例 這個(gè)圖 是一樣一樣的。只不過題目中圖沒有把 空節(jié)點(diǎn) 畫出來而已。

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

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

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

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 二叉樹
    +關(guān)注

    關(guān)注

    0

    文章

    74

    瀏覽量

    12296
  • 數(shù)組
    +關(guān)注

    關(guān)注

    1

    文章

    411

    瀏覽量

    25858

原文標(biāo)題:不懂就問!

文章出處:【微信號(hào):TheAlgorithm,微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    指電極上覆蓋敏感材料的阻值計(jì)算

    覆蓋的敏感材料厚度超出指厚度時(shí)計(jì)算電阻,是否可以視作指電極指間電阻多個(gè)周期串聯(lián)后與超出指厚度部分敏感材料電阻并聯(lián)
    發(fā)表于 07-05 14:48

    指MOSFET器件靜電防護(hù)魯棒性提升技巧

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

    串聯(lián)的總線舵機(jī)是不是只用一個(gè)UART接口就能控制?

    串聯(lián)的總線舵機(jī)是不是只用一個(gè)UART接口就能控制
    發(fā)表于 03-07 06:30

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

    二叉樹,將出現(xiàn)頻率高的字符用較短的編碼表示,而出現(xiàn)頻率低的字符則用較長(zhǎng)的編碼表示。通過這種方式,可以實(shí)現(xiàn)對(duì)數(shù)據(jù)進(jìn)行高效的編碼和解碼。 下面我們將詳細(xì)介紹哈夫曼編碼的算法過程。 統(tǒng)計(jì)字符頻率 在進(jìn)行哈夫曼編碼前,首先需
    的頭像 發(fā)表于 01-30 11:27 ?2238次閱讀

    如何修改內(nèi)核設(shè)備

    如何修改內(nèi)核設(shè)備
    的頭像 發(fā)表于 12-14 14:06 ?717次閱讀
    如何修改內(nèi)核設(shè)備<b class='flag-5'>樹</b>

    數(shù)字IC設(shè)計(jì)中的分段時(shí)鐘綜合

    為什么需要分段去做時(shí)鐘?因?yàn)樵谀承┣闆r下,按照傳統(tǒng)的方法讓每一個(gè)clock group單獨(dú)去balance,如果不做額外干預(yù),時(shí)鐘天然是做不平的。
    的頭像 發(fā)表于 12-04 14:42 ?1632次閱讀
    數(shù)字IC設(shè)計(jì)中的分段時(shí)鐘<b class='flag-5'>樹</b>綜合

    堆的實(shí)現(xiàn)思路

    什么是堆? 堆是一種 基于樹結(jié)構(gòu)的數(shù)據(jù)結(jié)構(gòu),它是一棵二叉樹 ,具有以下兩個(gè)特點(diǎn): 堆是一個(gè)完全二叉樹,即除了最后一層,其他層都是滿的,最后一層從左到右填滿。 堆中每個(gè)節(jié)點(diǎn)都滿足堆的特性,即父節(jié)點(diǎn)的值
    的頭像 發(fā)表于 11-24 16:02 ?364次閱讀
    堆的實(shí)現(xiàn)思路

    二叉樹的定義

    型結(jié)構(gòu) 是一類重要的 非線性數(shù)據(jù)結(jié)構(gòu) ,其中以二叉樹最為常用,直觀來看,是以分支關(guān)系定義的層次結(jié)構(gòu)。型結(jié)構(gòu)在客觀世界中廣泛存在,比
    的頭像 發(fā)表于 11-24 15:57 ?1149次閱讀
    <b class='flag-5'>樹</b>與<b class='flag-5'>二叉樹</b>的定義

    OP-TEE安全存儲(chǔ)安全文件的格式

    時(shí),默認(rèn)情況下, 加密后的數(shù)據(jù)會(huì)被保存在/data/tee目錄中。 安全存儲(chǔ)功能使用 二叉樹的方式來 保存加密后的文件。 當(dāng)?shù)谝淮问褂冒踩鎯?chǔ)功能創(chuàng)建用于保存敏感數(shù)據(jù)的安全文件時(shí),OP-TEE將會(huì)在/data/tee目錄中生成兩個(gè)文件:dirf.db文件和以數(shù)字命名的文件。 dirf.db文
    的頭像 發(fā)表于 11-21 11:49 ?635次閱讀
    OP-TEE安全存儲(chǔ)安全文件的格式

    極管的種類有哪些?又用在哪些地方?

    對(duì)于極管是什么,在昨天的時(shí)候給大家詳細(xì)解釋了一下,除此之外我們還有必要去了解一下極管的種類有哪些?又用在哪些地方?今天就簡(jiǎn)單給大家介紹一下幾款常用的極管,都很好理解,只要你看完
    的頭像 發(fā)表于 11-15 11:23 ?1475次閱讀
    <b class='flag-5'>二</b>極管的種類有哪些?又用在哪些地方<b class='flag-5'>呢</b>?

    什么情況下需要布隆過濾器

    , gmail等郵箱垃圾郵件過濾功能 這幾個(gè)例子有一個(gè)共同的特點(diǎn):如何判斷一個(gè)元素是否存在一個(gè)集合中? 常規(guī)思路 數(shù)組 鏈表 、平衡二叉樹、Trie Map (紅黑) 哈希表 雖然上面描述的這幾種數(shù)據(jù)結(jié)構(gòu)配合常見的排序、
    的頭像 發(fā)表于 11-11 11:37 ?597次閱讀
    什么情況下需要布隆過濾器

    紅黑的特點(diǎn)及應(yīng)用

    比起理解紅黑的原理,更重要的是理解紅黑的應(yīng)用場(chǎng)景,因?yàn)槟承?yīng)用場(chǎng)景的需要,紅黑才會(huì)應(yīng)運(yùn)而生。 紅黑的特點(diǎn): 插入,刪除,查找都是O(logn)的復(fù)雜度。 紅黑
    的頭像 發(fā)表于 11-10 11:16 ?660次閱讀
    紅黑<b class='flag-5'>樹</b>的特點(diǎn)及應(yīng)用

    如何在FPGA中實(shí)現(xiàn)高效的compressor加法?

    大規(guī)模的整數(shù)加法在數(shù)字信號(hào)處理和圖像視頻處理領(lǐng)域應(yīng)用很多,其對(duì)資源消耗很多,如何能依據(jù)FPGA物理結(jié)構(gòu)特點(diǎn)來有效降低加法的資源和改善其時(shí)序特征是非常有意義的。
    的頭像 發(fā)表于 11-08 09:06 ?1342次閱讀
    如何在FPGA中實(shí)現(xiàn)高效的compressor加法<b class='flag-5'>樹</b><b class='flag-5'>呢</b>?

    為什么MySQL索引要用B+tree?

    紅黑是一種特化的 AVL(平衡二叉樹),都是在進(jìn)行插入和刪除操作時(shí)通過特定操作保持二叉查找的平衡; 若一棵
    發(fā)表于 10-30 14:41 ?190次閱讀