數據結構の學習(一):可視化一棵二叉樹

 學習樹的時候,我們有一個最大的疑惑,就是如何可視化一顆二叉樹。因爲你總不可能指望永遠在嵌套列表中看出一顆樹出來。我們希望更直觀一些,就像上面那副圖一樣,簡單漂亮。這正是筆者在學習樹開始時乾的第一件事。

不幸的是,筆者的博客將不會有完整代碼(示範代碼除外),所有代碼均已上傳到碼雲上。如果時間和精力允許的話,強烈建議你根據思路,手動寫一遍,相信你會感覺到全身毛孔舒張而不是想砸電腦的快感。

很棒,我們首先介紹一個小巧精緻的python自帶的繪圖工具,Turtle。如果你還不熟悉它的話,你可以花幾分鐘瞭解官方英文文檔。在你瞭解了主要函數之後,我簡單介紹一下執行流程:

1)實例化turtle類,設置畫布大小和背景。設置爲penup模式(擡起畫筆),設置繪圖速度(一般的是norma),設置光標(當然是可愛的turtle啦);

2)設置起點,設置爲pendown模式(放下畫筆),有兩種方法畫直線,一種是用goto函數直線前進到終點。另一種是先設置方向setheading,再forward到終點。還有一些比如畫圓circle,寫字write函數也經常用到;

3)完成繪圖後一定要執行turtle.done()

是不是很簡單呢? 

我們畫二叉樹的主要方法是遞歸。我們從根節點開始,先遍歷左子樹,再遍歷右子樹。這是典型的前序遍歷,但我們在這裏不作介紹。另外畫樹也很有技巧,如果你是一個畫家,你會花很多時間去讓的你的作品美觀,但是作爲程序員,我們希望用最簡潔最直觀的方式去實現它的功能。我們可以寫一個畫節點函數draw_node,它可以在一個特定座標(x,y)去畫一個圓,turtle畫圓是從邊緣某個點逆時針畫圓的,比如這裏我們可以設置爲圓的正下方最低點。然後在圓中間寫上字符數據。之後我們實現一個畫樹枝的函數draw_branch,它的 作用是從某一點(比如圓的最低點)向左或向右沿特定方向畫一條線段,你可以設置它的粗細和顏色。但是如果你讓樹每一個深度的樹枝張開角度一樣的話,那麼結果一定不會讓你高興,下面節點會重合,因此我們需要讓樹枝張開的角度隨着深度加深適當減小一些,當然你也可以讓樹枝變短一些。這實際是一個幾何題,當然,不必花太多時間糾結。我們還可以用一個字典去記錄所有節點的座標,這樣的話,我們後面可以將樹的遍歷路徑畫出來,這想法是不是很不錯!

思路如下:

1)我們先定義printTree類,然後依次完成draw_branch,draw_node基礎函數:

2)我們定義一個函數draw_binary_tree。從根節點開始遍歷,終止條件是node==None。我們設置一個整數變量level記錄樹的深度,先畫一個節點,然後看它有沒有左子樹,如果有的話,先把樹枝畫出來,遞歸調用draw_binary_tree,傳入的是左子節點。右邊也是一樣。

 

最後你就可以得到一個海龜畫的樹了。這是動畫

希望本博客對你有幫助。

 

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