畫二叉樹小工具

學習樹的時候,經常需要在紙上畫出邏輯存儲結構。不僅不環保, 還麻煩。寫了一個畫二叉樹的小工具dtree(drawtree)。源代碼參考下面鏈接。

先上個圖





該工具是基於終端字符圖形庫ncurses實現的, 其實如果完全不用第三方庫, 也能實現, 只不過有些限制和麻煩。

一般linux發行版都有ncurses(或者curses)庫, dtree工具用ncurses庫方便移動光標。 如果不用ncurses庫的話, 需要額外的數據結構記錄每個座標位置當前顯的個字符。

還有ncurses庫提供了COLS宏智能的顯示當前終端的寬度,如果自己獲取終端寬度可能比較麻煩。

記錄一下實現這個工具的思路:

認識2個結構:

struct Node  一般樹的存儲節點, 含有 左孩子域, 右孩子域和數據域。

struct DNode  在Node結構上增加了index域, 代表 對應滿二叉樹中的位置索引。


config.h文件定義一些常量。

MAX_NODE  可以畫的最多DNode節點數目。

LEAF_MARGIN 樹最底一層中, 相鄰連個DNode之間的距離。


自定義名詞:

遞減因子: 每個節點與兄弟節點之間的距離除以自己孩子節點之間的距離。


實現基本思路是這樣的:

先將Node結構轉成DNode結構。找出每層第一個節點與index的關係式, 以每層第一個節點做爲該層所有節點的參考, 計算自己的座標,根據數學推算, 可以算出每個節點座標和index的關係式。遞減因子取2, 畫出所有節點。

缺陷:

1. 節點之間畫的比較稀疏, 如果樹平衡性比較差, 畫的數目更小。 解決辦法, 每層之間的遞減因子 調節小一點, 小於2, 嘗試把樹旋轉成平衡樹。

2. 座標移動依賴ncurses庫, 解決辦法: 可以完全基於空格( '   ')和換行('\n')來移動座標, 但是需要數組存儲每個位置的字符, 並且, 顯示區域的寬度不能動態適應。


源代碼下載鏈接

http://download.csdn.net/detail/karizhang/6668639



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章