完全二叉樹視覺化

2021-10-23 09:30:55 字數 2818 閱讀 6566

最近在看一些資料結構和演算法,對二叉樹接觸比較多,寫程式時要想知道樹的狀態只能通過監視視窗翻著看,比較費事而且不清晰,因此想寫個將二叉樹視覺化的程式,不過筆者水平有限,暫時只實現了針對完全二叉樹的,如果不是完全二叉樹則可以用0或其他特徵字元代替前部預設的字元,以下分享給大家取用。

貼**之前先放個原理圖,應該也是大家寫相關程式主要要解決的問題:樹同一層節點資料的間隔長度:

以下程式在visual stadio2017通過c++程式進行開發:

void

showtree

(t* arr,

int len)

if(len ==0)

return

;//如果這個樹總長為0,直接返回

int* gap=

newint

[len+1]

();//儲存樹相鄰節點距離

int* pos =

newint

[len +1]

;int

* alen =

newint

[len+1]

;//儲存節點字元長度

int cnt,tmp,wid=

1,dep=

log2

(len)

;int dtmp = dep-1;

int i;

for( i=

0; i < len; i++

) alen[len]=1

;for

(int j = len /

2; j < len; j++

) gap[len]=1

;//末尾再設定個為1的間隔

int j =

pow(

2, dtmp)-1

;//倒數第二行的起點

tmp =

(alen[

2* j +1]

+ gap[

2* j +2]

+ alen[

2* j +2]

- alen[j])/

2;gap[j]

= gap[

2* j +1]

+ tmp+1;

//該點(左側起點)前部間隔為...

//2*j+1代表左子節點,2*j+2代表右子節點

for(j++

; j < len/

2; j++

) dtmp--

;//以下為其餘各層的前部間隔計算公式

for(i = dtmp; i >=

0; i--

) dtmp--

;//每次層數減一(向上)

}int newdep =1;

for(cnt =

0; cnt < gap[0]

; cnt++

)cout <<

" ";

cout << arr[0]

<< endl;

//將第一行列印出來,上方無斜槓,因此與以下迴圈分離

while

(newdep < dep)

cout << endl;

//每處理完一行則換行

//列印字元

for(i =

pow(

2, newdep)-1

; i <

pow(

2, newdep +1)

-1; i++

) cout << endl;

newdep++;}

//最後一層單獨處理

i =pow(

2, newdep)-1

;for

(cnt =

0; cnt < gap[i]

+ alen[i]/2

; cnt++

)cout <<

" ";

cout <<

'/';

for(i++

; i < len; i++

) cout << endl;

for(i =

pow(

2, newdep)-1

; i < len; i++

) cout << endl;

delete

gap;

delete

pos;

delete

alen;

//最後還要記得記憶體**

}int

main()

;showtree

(arr,10)

;system

("pause");

}

裡邊注釋比較多久不多介紹了,而筆者這裡做的輸入介面是二叉樹的層序遍歷,因此二叉樹結構體需要先做層序遍歷,這個有很多的例程,這裡也提供乙個:

vector<

int>

levelorder

(treenode* root)

}return res;

}

這裡採用的返回值是vector容器,由於其迭代器就是指標,因此可以很容易將vector轉為陣列,例如:

vector<

int> ans;

ans =

newlevelorder

(tre)

;int

* a =

&ans[0]

;

這是所完成的視覺化效果演示:

二叉樹視覺化 Graphviz

大家平時寫c程式有沒有種把記憶體裡的資料結構全給畫出來的衝動呢?資料量小的話,畫起來還蠻簡單,用viso,我前面的文章都用viso畫的。之前寫紅黑樹 的時候,用的是命令列把整個樹列印出來,不過只是一些小片段,很醜,還得自己手動再在紙上畫一遍,非常麻煩,要是用程式就能把圖畫出來那就爽了。好了,推薦使用...

二叉樹視覺化建立(二叉樹正輸出)

1.上面簡單的介紹了二叉樹的線性儲存.2.分析二叉樹的橫向列印.由於在終端上如果不呼叫系統座標函式,而只呼叫printf 來輸出,只能是從上到下從左到右進行,根據這一特點我們只需要 知道每個節點所在的x座標 即前面空了x 1個空格 再加上層次列印就非常容易列印二叉樹了,如根節點可以計算的其座標為 1...

二叉樹python實現和視覺化

在刷leetcode時,有時候需要在本地除錯 但是苦於本地沒有樹的資料型別,所以自己動手用python寫了乙個二叉樹類,並且實現了視覺化。下面的程式僅僅是為了建立二叉樹,方便在刷leetcode有關題目時進行本地除錯 所以有些功能沒有加上去,比如刪除節點的功能。程式雖然是二叉樹類,也容易擴充套件到多...