Binary Tree應該是Tree的入門磚,沒想到其實還滿燒腦的,趁這幾天研究完還有記憶時趕快寫點筆記,以免日後忘記。
基本上Binary Tree的特性和性質,像是完滿二元樹或是節點數目怎計算就先不提了,直接來說說實作的部份。
本文先重點在Binary Tree的建立,在這之前可能要先了解下前序、中序、後序走訪。一般(就我能看到的)的範例程式碼建立Tree都是手刻一棵樹,滿沒有效率,而且想換棵樹例子就要重新刻一遍,我真的是......,後來還是從書中找到比較好的方法,但要先了解前序走訪就是。直接推薦好文。
(但這篇文的二元樹就是手刻的)
Binary Tree的最重要特色就是每個node最多只有2個子node,以及自己的資料。
在翻閱Binary Tree的書及網路資料,大部份的都在建立Tree時,node和node自己建立pointer關係,例如:
下次換了一棵樹做例子,直接GG。手動刻樹真的很麻煩,刻錯的可能性又很高。
所以建立二元樹的方法可利用走訪的方法來建立。
下圖是從書中擷取下來的二元樹範例,左方是我們要建立的二元樹,以前序走訪來說此二元樹為ABDC。But!當要建立二元樹時,只說是ABDC + 前序走訪,除了可確定A是根節點,其他BDC怎麼排列是不知道的(無法知道樹的長相)。
圖中右邊則是被稱為擴展二元數,意思是用#符號來代替null,也就是代表node B無左子樹,node D無左右子樹的意思。這樣用前序走訪就會是AB#D##C##。
當遇到1個#代表左子樹為null,遇到2個#則左右子樹皆為null
而程式碼和前序走訪幾乎是相同的,差別在要塞資料到節點裡。
這裡有個地方要注意CreateBinaryTree,傳進去的是BiTree*,也就是指標的指標,這麼做原因是遞迴生成時,不會傳入null。假如傳進去的是BiTree T,如下面程式碼,則等於傳入了null。這裡算是個小技巧。
CreateBinaryTree(T->lchild); /* 遞迴建立左子樹 */
CreateBinaryTree(T->rchild); /* 遞迴建立右子樹 */
Reference
- 程杰-大話資料結構