通過樹的中序和先序遍歷生成二叉樹

關(guān)于二叉樹的概念:

百度百科給的定義是:

二叉樹是一個(gè)連通的無環(huán)圖吠昭,并且每一個(gè)頂點(diǎn)的度不大于3铐然。有根二叉樹還要滿足根結(jié)點(diǎn)的度不大于2。有了根結(jié)點(diǎn)之后,每個(gè)頂點(diǎn)定義了唯一的父結(jié)點(diǎn)努隙,和最多2個(gè)子結(jié)點(diǎn)。然而费韭,沒有足夠的信息來區(qū)分左結(jié)點(diǎn)和右結(jié)點(diǎn)别垮。如果不考慮連通性,允許圖中有多個(gè)連通分量晶府,這樣的結(jié)構(gòu)叫做森林桂躏。

二叉樹是遞歸定義的,其結(jié)點(diǎn)有左右子樹之分川陆,邏輯上二叉樹有五種基本形態(tài):

圖一

(1)空二叉樹——如圖(a)剂习;

(2)只有一個(gè)根結(jié)點(diǎn)的二叉樹——如圖(b);

(3)只有左子樹——如圖(c);

(4)只有右子樹——如圖(d)鳞绕;

(5)完全二叉樹——如圖(e)失仁。

注意:盡管二叉樹與樹有許多相似之處,但二叉樹不是樹的特殊情形

我們來提煉一下定義中存在的信息:二叉樹是符合每個(gè)節(jié)點(diǎn)的子樹個(gè)數(shù)不能超過2的们何,且僅有一個(gè)根節(jié)點(diǎn)特征的樹的集合


關(guān)于二叉樹的先序遍歷萄焦,中序遍歷和后序遍歷:(此處只做大概的解釋,想要詳細(xì)了解的朋友可以點(diǎn)這里

先序遍歷:先訪問根節(jié)點(diǎn)冤竹,在訪問左節(jié)點(diǎn)拂封,最后訪問右節(jié)點(diǎn)(根左右)

中序遍歷:先訪問左節(jié)點(diǎn),在訪問根節(jié)點(diǎn)鹦蠕,最后訪問右節(jié)點(diǎn)(左根右)

后序遍歷:先訪問左節(jié)點(diǎn)烘苹,在訪問右節(jié)點(diǎn),最后訪問根節(jié)點(diǎn)(左右根)


做了這么多的準(zhǔn)備工作片部,接下來我們來看看如何通過一個(gè)二叉樹的先序遍歷和中序遍歷確定一顆樹:

我們先分析一下:根據(jù)先序遍歷的特性镣衡,我們能知道,第一個(gè)節(jié)點(diǎn)一定是整棵樹的根節(jié)點(diǎn)档悠,知道了根節(jié)點(diǎn)后廊鸥,我們可以在中序遍歷總找到根節(jié)點(diǎn)的位置,通過中序遍歷的特性辖所,我們可以知道在根節(jié)點(diǎn)左邊的節(jié)點(diǎn)都是左子樹即根節(jié)點(diǎn)的孫子節(jié)點(diǎn)惰说,在根節(jié)點(diǎn)右邊的都是根節(jié)點(diǎn)的右子樹即根節(jié)點(diǎn)的孫子節(jié)點(diǎn)。通過下面的實(shí)例能理解更深:

先:ABDECFGHI

中:DBEAGFHIC

第一步:通過先序找到根節(jié)點(diǎn)為A,并且找到A在中序中的位置

第二步:通過A我們將序列劃分為?

? ? ? ? ? ? ? ? ?左子樹及其子節(jié)點(diǎn):DBE?

? ? ? ? ? ? ? ? ?右子樹及其節(jié)點(diǎn):GFHIC

這樣的話缘回,我們就可以對于得到的新序列進(jìn)行再一次劃分吆视,這個(gè)熟悉遞歸的朋友就能知道,接下來就是遞歸的典型使用場景了酥宴。我就不多加敘述啦吧,一切盡在代碼中。

算法流程如下:

?1.將先序序列及中序序列劃分為左區(qū)和右區(qū)域

2.重復(fù)步驟1拙寡,直到以下情況才能終止遞歸

? ? ? a.當(dāng)序列長度僅為1時(shí)授滓,只剩下一個(gè)節(jié)點(diǎn)

? ? ? b.當(dāng)序列長度為0時(shí),返回節(jié)點(diǎn)null


本人使用java實(shí)現(xiàn)的代碼如下:(僅貼出部分重要代碼)

需要閱讀完整代碼的朋友可以移步到通過先序中序創(chuàng)建二叉樹

class TreeNode{

? ? ? ? ? ?public String nodeName;

? ? ? ? ? ?public TreeNode lchild;

? ? ? ? ? ? public TreeNode rchild;

? ? ? ? ? ? public TreeNode(String nodeName,TreeNode lchild,TreeNode rchild) {

? ? ? ? ? ? ? ? ? ? ? ? this.nodeName=nodeName;

? ? ? ? ? ? ? ? ? ? ? ? this.lchild=lchild;

? ? ? ? ? ? ? ? ? ? ? ? this.rchild=rchild;

? ? ? ? ? ?}

}

這是一個(gè)表示節(jié)點(diǎn)的類肆糕,用于存儲(chǔ)節(jié)點(diǎn)

public TreeNode creatTree(String bef,String mid) {

? ? ? ? ? ? ? ? ? ? String root=bef.substring(0, 1);

? ? ? ? ? ? ? ? ? ? int rootindex=mid.indexOf(root);

? ? ? ? ? ? ? ? ? ? System.out.println(rootindex);

? ? ? ? ? ? ? ? ? ? String leftBef=bef.substring(1, rootindex+1);

? ? ? ? ? ? ? ? ? ? ?String leftMid=mid.substring(0, rootindex);

? ? ? ? ? ? ? ? ? ? ?System.out.println("left child:"+leftBef+"? ? "+leftMid);

? ? ? ? ? ? ? ? ? ? ?TreeNode lchild=initTree(leftBef,leftMid);

? ? ? ? ? ? ? ? ? ? ?int len=mid.length();

? ? ? ? ? ? ? ? ? ? ?String rightBef=bef.substring(rootindex+1,len);

? ? ? ? ? ? ? ? ? ? ?String rightMid=mid.substring(rootindex+1,len);

? ? ? ? ? ? ? ? ? ? ?System.out.println("right child:"+rightBef+"? ? "+rightMid);

? ? ? ? ? ? ? ? ? ? ?TreeNode rchild=initTree(rightBef,rightMid);

? ? ? ? ? ? ? ? ? ? ?rootNode=new TreeNode(root, lchild, rchild);

? ? ? ? ? ? ? ? ? ? ?return rootNode;

}

/**

* 遞歸

* @param bef

* @param mid

* @return

*/

public TreeNode initTree(String bef,String mid) {

? ? ? ? ? if(bef.length()==1&&mid.length()==1) {

? ? ? ? ? ? ? ? ? ? ? ?return new TreeNode(bef, null, null);

? ? ? ? ? }


? ? ? ? String root=bef.substring(0, 1);

? ? ? ? int rootindex=mid.indexOf(root);

? ? ? ? String leftBef=bef.substring(1, rootindex+1);

? ? ? ? String leftMid=mid.substring(0, rootindex);

? ? ? ? TreeNode lchild=null;

? ? ? ? if(leftBef.length()==leftMid.length()&&leftBef.length()!=0) {? //不為空時(shí)

? ? ? ? ? ? ? ? lchild=initTree(leftBef,leftMid);

? ? ? ? }

? ? ? ?int len=mid.length();

? ? ? ?String rightBef=bef.substring(rootindex+1,len);

? ? ? ?String rightMid=mid.substring(rootindex+1,len);

? ? ? TreeNode rchild=null;

? ? ?if(rightMid.length()==rightBef.length()&&rightBef.length()!=0) {

? ? ? ? ? rchild=initTree(rightBef,rightMid);

? ? ?}

? ? ?TreeNode rootNode=new TreeNode(root, lchild, rchild);

? ? ? return rootNode;

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末般堆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子诚啃,更是在濱河造成了極大的恐慌淮摔,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件始赎,死亡現(xiàn)場離奇詭異和橙,居然都是意外死亡仔燕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門胃碾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涨享,“玉大人,你說我怎么就攤上這事仆百〔匏恚” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵俄周,是天一觀的道長吁讨。 經(jīng)常有香客問我,道長峦朗,這世上最難降的妖魔是什么建丧? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮波势,結(jié)果婚禮上翎朱,老公的妹妹穿的比我還像新娘。我一直安慰自己尺铣,他們只是感情好拴曲,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凛忿,像睡著了一般澈灼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上店溢,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天叁熔,我揣著相機(jī)與錄音,去河邊找鬼床牧。 笑死荣回,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的叠赦。 我是一名探鬼主播驹马,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼除秀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起算利,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤册踩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后效拭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暂吉,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胖秒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了慕的。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阎肝。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖肮街,靈堂內(nèi)的尸體忽然破棺而出风题,到底是詐尸還是另有隱情,我是刑警寧澤嫉父,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布沛硅,位于F島的核電站,受9級特大地震影響绕辖,放射性物質(zhì)發(fā)生泄漏摇肌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一仪际、第九天 我趴在偏房一處隱蔽的房頂上張望围小。 院中可真熱鬧,春花似錦树碱、人聲如沸肯适。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疹娶。三九已至,卻和暖如春伦连,著一層夾襖步出監(jiān)牢的瞬間雨饺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工惑淳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留额港,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓歧焦,卻偏偏與公主長得像移斩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子绢馍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容

  • //轉(zhuǎn)載請標(biāo)明出處向瓷,原文地址:http://blog.csdn.net/hackbuteer1/article/d...
    大海一滴寫字的地方閱讀 678評論 0 2
  • 姓名: 李小娜 [嵌牛導(dǎo)讀] :這篇文章主要介紹了Java二叉排序樹,包括二叉排序樹的定義舰涌、二叉排序樹的性質(zhì)猖任、二叉...
    n184閱讀 631評論 0 0
  • 介紹:樹是數(shù)據(jù)結(jié)構(gòu)中非常重要的一種,主要的用途是用來提高查找效率瓷耙,對于要重復(fù)查找的情況效果更佳朱躺,如二叉排序樹刁赖、FP...
    徐德東閱讀 943評論 0 0
  • 二叉樹的定義 二叉樹(binary tree)是結(jié)點(diǎn)的有限集合,這個(gè)集合或者空长搀,或者由一個(gè)根及兩個(gè)互不相交的稱為這...
    飄顏閱讀 433評論 0 2
  • 一.前序遍歷 非遞歸實(shí)現(xiàn) 根據(jù)前序遍歷訪問的順序,優(yōu)先訪問根結(jié)點(diǎn)巢钓,然后再分別訪問左孩子和右孩子病苗。即對于任一結(jié)...
    Arryn_閱讀 917評論 0 0