在搞編譯原理實驗的時候,最後要求輸出一棵漂漂亮亮的語法樹,便突然想起了二叉樹輸出這個在初學程式設計時困擾過我的問題,索性就在這裡把它解決了吧。
ps:對於只是想明白怎麼輸出樹的同學,部落格中編譯原理相關的知識可以自行跳過。
先來看看最終效果
應該能滿足大部分人的要求…?符號是用string定義的,如果有長度不為1的情況也可以支援
首先來看看treenode的定義,我們跳過了建樹的過程,可以根據場景自行研究
我們的輸出結構大概是這樣,整棵樹會被劃分成若干行(包含深度相同的一行節點),有乙個輸出陣列layer記錄該行所有節點的輸出資訊,然後通過bfs(寬度優先搜尋),每次將某一行的節點都取出填入輸出陣列後,將該輸出陣列輸出。
對於每一行,實際是由三個物理行組成,第一行是在符號上面的『|』標誌,第二行是符號本身,第三行是連續的幾段「----」。我們發現第一行和第二行所需的資訊是該節點應該在哪個位置輸出,第三行所需的資訊是一段足以覆蓋該節點兒子們的位置資訊,也就是可以從第乙個兒子覆蓋到最後乙個兒子就行(可以看例子,c下面有三個『-』,覆蓋了c和c)。所以終歸來看實際所需的就是每個節點的位置資訊即可,我選擇的分配位置的方式就是從左至右依次分配。
另外,節點也需要儲存深度資訊,用於最後輸出的時候表明誰和誰一行。
為了得到位置和深度資訊,需要做兩次dfs(深度優先搜尋)
第一次搜尋處理深度和size資訊(表示該節點需要占用多寬空間,父節點一定是大於等於子節點的)
第二次dfs給每個節點安排輸出位置,緊貼著就好。
bfs輸出
其中的printline函式:
這樣看來過去自己想的很繁瑣的樹輸出問題其實還是有據可循,我的結果雖然可能不夠漂亮,但它是一棵符合定義的象形的樹了。
如何用Python畫一棵漂亮的樹
海龜繪圖turtle 在1966年,seymour t和wally feurzig發明了一種專門給兒童學習程式設計的語言 logo語言,它的特色就是通過程式設計指揮乙個小海龜 turtle 在螢幕上繪圖。海龜繪圖 turtle graphics 後來被移植到各種高階語言中,python內建了turt...
如何判斷一棵樹是不是另一棵樹的子樹
package suanfatest class treenode treenode int value treenode int value,treenode leftchild,treenode rightchild public int getvalue public void setvalu...
如何建立一棵哈夫曼樹並且輸出壓縮碼
如何建立一棵哈夫曼樹並且輸出壓縮碼 演算法 1 給定乙個具有 n個權值 的結點的集合 f 2 初始時,設集合 a f。3 執行i 1 至n 1 的迴圈,在每次迴圈時執行以下操作 從當前集合中選取權值最小 次最小的兩個結點,以這兩個結點作為內部結點 bi的左右兒子,bi的權值為其左右兒子權值之和。在集...