最近在看一些資料結構和演算法,對二叉樹接觸比較多,寫程式時要想知道樹的狀態只能通過監視視窗翻著看,比較費事而且不清晰,因此想寫個將二叉樹視覺化的程式,不過筆者水平有限,暫時只實現了針對完全二叉樹的,如果不是完全二叉樹則可以用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有關題目時進行本地除錯 所以有些功能沒有加上去,比如刪除節點的功能。程式雖然是二叉樹類,也容易擴充套件到多...