排序二叉樹
二叉樹:作為基本資料結構的一種,是紅黑樹,b樹等樹形結構的基礎。而排序二叉樹是按照二叉樹的結構來組織的。在本文中採用鍊錶結構來建立二叉樹。排序二叉樹的 基本原理:
排序二叉樹是將歸併排序的基本思想構建二叉樹結構,再用中序遍歷的規則來遍歷樹的各個節點,輸出的結果就是有序序列(本文是將一組無序的整型數值儲存在二叉樹中,通過中序遍歷二叉樹將數值輸入,而得到一組按照由小到大排序的序列,從而間接實現了排序。所以下文的解釋和說明都以此為例)。
插入節點的過程:
1.判斷根節點是否為空?如果為空,插入節點作為根節點,結束;否則,轉2;
2.將要插入的數值和比較節點的數值進行比較。如果插入插入數值大於等於節點數值轉3;否則轉4;
3.如果比較節點的右子樹為空,將比較節點的右指標指向插入節點,結束;否則,將比較節點的右子樹的根節點作為新的比較節點,轉2;
4.如果比較節點的左子樹為空,將比較節點的左指標指向插入節點,結束;否則,將比較節點的左子樹的根節點作為新的比較節點,轉2;
通過上述的插入過程實現的二叉樹,可以得出:對於根節點,它左邊的所有節點的值都小於它;而它右邊的所有節點是數字都大於或等於它。中序遍歷的過程是「左子節點->父節點->右子節點」 ,這樣數值的輸出便具有了一定的順序,這個規則的不斷重複,就是歸併排序思想的體現。同時該插入過程符合遞迴的特性。
演算法分析(時間複雜度):
查詢過程:二叉樹查詢過程的時間和二叉樹的高度成正比。假設二叉樹的高度為n,則查詢最大值,最小值,前繼結點後和後繼節點的時間都可以在o(n)時間內實現。所以樹的高度直接決定查詢的效率。對於擁有n個節點的二叉樹,形成完全二叉樹時樹的高度是最小的,即最小為lg(n);
刪除和插入過程:在二叉樹刪除和插入過程,查詢過程是必須的前奏;所以插入和刪除的最小為(lg(n)+o(1)),其中o(1)為插入和刪除的時間。
1 #include "stdafx.h
"2 #include 3 #include 45//
非遞迴方法插入節點
6void insertbtree(node *root,int
value)720
else
2131
else
323536}
37else
3844
else
4548}49
}50} 51}
5253
//採用遞迴的方法插入節點
54void insertbtreere(node *root,int
value)
5562
else
6374
else
7578}79
else
8089
else
9093}94
}95}96
9798
//將乙個整數陣列中的數字按照歸併排序的原理進行儲存
99void buildbtree(int *p, int n,node *root)
100124
else
125128
}129
else
130136
else
137140
}141
}142
143}
144145
}146
147//
按照中序遍歷二叉樹
148void midsearchbtree(node *proot)
149156
}157
158int
main()
159;
165 buildbtree(a,5
,croot);
166midsearchbtree(croot);
167 printf("\n"
);168
169while(scanf_s("
%d",&input)&& input!=1
)170
173midsearchbtree(croot);
174 printf("\n"
);175
176 insertbtreere(croot,10
);177
midsearchbtree(croot);
178 printf("\n"
);179
return0;
180 }
二叉樹,排序二叉樹
說到二叉樹,這可是資料結構裡面的非常重要的一種資料結構,二叉樹是樹的一種,本身具有遞迴性質,所以基於二叉樹的一些演算法很容易用遞迴演算法去實現。作為一種非線性結構,比起線性結構還是相對複雜的,很多人甚至看不懂演算法的意思,不能理解。其實一開始接觸這些東西還是挺暈的,不過你多看幾遍,上機實現可能你就會...
排序二叉樹or搜尋二叉樹or查詢二叉樹
排序二叉樹,搜尋二叉樹,查詢二叉樹都是乙個意思,只是叫法不同而已。下面的文章中我們統稱為排序二叉樹。本文主要是針對高中資訊學,因此其中不涉及到指標,所有需要用指標的地方都直接使用陣列進行模擬。排序二叉樹定義 1 若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值 2 若右子樹不空,則右子...
排序二叉樹or搜尋二叉樹or查詢二叉樹
排序二叉樹,搜尋二叉樹,查詢二叉樹都是乙個意思,只是叫法不同而已。下面的文章中我們統稱為排序二叉樹。本文主要是針對高中資訊學,因此其中不涉及到指標,所有需要用指標的地方都直接使用陣列進行模擬。排序二叉樹定義 1 若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值 2 若右子樹不空,則右子...