二叉樹和排序
排序是演算法中最典型的一類問題,也是顯示計算機的特點的一類問題。在任何計算機演算法課程中,都會先後給出幾種著名的排序演算法。二叉樹排序是眾多排序演算法中很有趣的乙個,隨著排序二叉樹的生成過程,整個排序任務也得到了完成。
下圖是兩個簡單的排序二叉樹例子:
序列:3, 8, 1
排序二叉樹:
3 //
/ /
1 8
-------->
然後,按照上圖中箭頭的方向,從左到右依次讀出樹中的數字,就是排序的結果:1, 3, 8。
序列:7, 14, 9, 11, 5, 17
排序二叉樹:
7 //
/ /
5 14
// / /
9 17
/ /
11 ------------->
同樣,按照上圖箭頭的方向,從左到右依次讀數的結果為:5, 7, 9, 11, 14, 17。
觀察這些例子,可以驗證排序二叉樹的定義。排序二叉樹的任何乙個節點是:
根據這個定義,首先可以確定的是二叉樹的資料結構,其實現如下:
template
struct tree;
整個排序過程,就是建立二叉樹的過程,因此可以大致寫出這個演算法的思路:
這個演算法敘述非常簡單,但是其引入了乙個新的關鍵問題——「插入」。在解決「插入」這個關鍵問題前,演算法可實現如下:
//演算法定義
template
struct buildsorttree;
//平凡解
template
<> struct buildsorttree;
//普通情況
template
struct buildsorttree;
紅色粗體表示引入的新「關鍵問題」,也就是將乙個數值插入到某排序二叉樹的演算法。根據排序二叉樹定義中的最後一點,可以描述如下:
根據這個敘述,此插入演算法可以實現如下:
//定義
template
struct inserttotree;
//平凡解
template
struct inserttotree;
//普通情況
template
struct inserttotree;
template
<> struct if;
typedef
typename if< (n::result result;
};
為了驗證演算法的正確性,還需要乙個能夠列印出二叉樹的程式,該程式從左到右依次掃瞄整棵樹,凡節點為空則跳過,否則列印出節點的數值。其實現如下:
template
struct printtree
};
template
<> struct printtree
};
寫在main()函式中的測試**為:
typedef list<7, list<14, list<9,
list<11, list<5, list<17, empty>>>>>> testlist;
printtree< buildsorttree::result >::print();
程式輸出排好的序列:5, 7, 9, 11, 14, 17。
scheme**參考
排序二叉樹**
(define-struct num-tree (left n right))
(define (insert-to-tree n atree)
(cond
[(empty? atree) (make-num-tree empty n empty)]
[(< n (num-tree-n atree))
(make-num-tree
(insert-to-tree n (num-tree-left atree))
(num-tree-n atree)
(num-tree-right atree) )]
[else
(make-num-tree
(num-tree-left atree)
(num-tree-n atree)
(insert-to-tree n (num-tree-right atree)) )]
(define (bst alon)
(cond
[(empty? alon) empty]
[else (insert-to-tree (first alon) (bst (rest alon)) )]
類別:計算機技巧
| | 瀏覽(366) |
(2)
網 易 yeah.net 郵 箱 夏 日 大 變 臉,帶 你 感 受 新 一 代 郵 箱 的 全 新 魅 力 >>
二叉樹,排序二叉樹
說到二叉樹,這可是資料結構裡面的非常重要的一種資料結構,二叉樹是樹的一種,本身具有遞迴性質,所以基於二叉樹的一些演算法很容易用遞迴演算法去實現。作為一種非線性結構,比起線性結構還是相對複雜的,很多人甚至看不懂演算法的意思,不能理解。其實一開始接觸這些東西還是挺暈的,不過你多看幾遍,上機實現可能你就會...
排序二叉樹or搜尋二叉樹or查詢二叉樹
排序二叉樹,搜尋二叉樹,查詢二叉樹都是乙個意思,只是叫法不同而已。下面的文章中我們統稱為排序二叉樹。本文主要是針對高中資訊學,因此其中不涉及到指標,所有需要用指標的地方都直接使用陣列進行模擬。排序二叉樹定義 1 若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值 2 若右子樹不空,則右子...
排序二叉樹or搜尋二叉樹or查詢二叉樹
排序二叉樹,搜尋二叉樹,查詢二叉樹都是乙個意思,只是叫法不同而已。下面的文章中我們統稱為排序二叉樹。本文主要是針對高中資訊學,因此其中不涉及到指標,所有需要用指標的地方都直接使用陣列進行模擬。排序二叉樹定義 1 若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值 2 若右子樹不空,則右子...