二叉樹和排序

2021-04-15 00:48:19 字數 2749 閱讀 4245

二叉樹和排序

排序是演算法中最典型的一類問題,也是顯示計算機的特點的一類問題。在任何計算機演算法課程中,都會先後給出幾種著名的排序演算法。二叉樹排序是眾多排序演算法中很有趣的乙個,隨著排序二叉樹的生成過程,整個排序任務也得到了完成。 

下圖是兩個簡單的排序二叉樹例子:

序列: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 若右子樹不空,則右子...