建立二叉樹

2021-05-23 14:27:40 字數 856 閱讀 8903

今天看到了乙個資料結構的筆試題目,他要求寫出建立二叉樹的程式。我想練習練習,所以想了一下其大致的思路,記錄如下:

題目的要求很簡單,給出乙個字串序列:比如說a(b(d,e(h(j,k(l,m(,n))))),c(f,g(,i))),然後要求按照其規則建立二叉樹,題目不難但是卻花費了我不少的時間~

第一步,我想到的是需要什麼樣的資料結構。二叉樹肯定有典型的結構可用了。關鍵是用什麼樣的資料結構把a 和b,c之間的父子關係表達出。而a和b,c不是在一起的。中間的部分有點對稱性,『(』與『)』的對稱,如何消除這部分呢,想到了用棧。

第二步,就是考慮棧需要什麼樣的儲存規則來表示這個二叉樹呢? 我的想法是先從最常規的開始,慢慢的匹配,逐漸地修正其規則 常規的想法是按順序乙個乙個地存放,要用的儲存,不要用的刪掉。

按照這個思路,我先試一下,有兩個問題:首先可以肯定的是'('沒有用,不需要儲存,但是想b,d,e,h之類的是有時候有用,有時候沒有用。怎麼判斷什麼時候有用什麼時候沒有用 還有就是如何表述左右節點的關係:a(b(d,e)顯然b是a的左節點,d是b的左節點,e是b的右節點。

首先解決第乙個問題:什麼時候有用,b,d,e之類的用途無非是用來當做父節點,如果其有子節點的話,可以找到它。所以如果其沒有子節點的話,我們根本不必儲存。怎麼判定呢?分析就知道,其後如果是'('的話,說明有子節點

其次是左右子節點的問題:顯然跟在『(』後面的是左節點,跟在『,』後面的是右節點。

綜合上面的分析我們得出建立二叉樹的思路如下:

掃瞄字串,從頭開始:

如果是字串而且其後是『(』,那麼儲存在棧裡,建立節點儲存起來,如果其前是『(』則把其當做棧中字元的左節點,如果其前事『,』那把其當做當前棧的右節點 如果是『(』,則忽略,如果是『,』忽略,如果是『)』那麼從棧裡彈出節點。

建立二叉樹 後序建立二叉樹

由後序遍歷可知,輸入順序是左結點 右結點 子樹根結點 比如輸入如下樹 ab cde 輸入序列為 e d b c a 思路 使用棧,對左結點和右結點進行壓棧 1.當輸入遇到非 且棧中元素大於等於2,則可以確定乙個小三角樹形,並將這個樹根作為下乙個小三角樹形的乙個子節點 2.當輸入遇到非 但棧中元素小於...

建立二叉樹

二叉樹在結構上不依賴組織鍊錶 指路法通過根節點與目標節點的相對位置進行定位 define bt left 0 define bt right 1 typedef unsigned long long btpos 結點指標域定義 typedef struct tag btressnode btress...

建立二叉樹

開發工具與關鍵技術 2020年5月 27 日 一棵二叉樹是結點的乙個有限集合,該集合或者為空,或者是由乙個根節點加上兩顆分別稱為左子樹和右子樹的 相互不相交的二叉樹組成,每個結點最多只有兩個孩子。二叉樹的順序儲存結構,用一組連續的的儲存單元存放二叉樹中的元素,即按滿二叉樹的形式存放在一維陣列中。由於...