一、實驗名稱:伸展樹算法設計與實現
二、實驗目的:
1.掌握伸展樹的數據結構。
2.掌握伸展算法的實現。
三、實驗內容
完善下列程序,並回答問題。
1 #include <iostream.h>
2 enum ResultCode{Underflow, Overflow, Success, Duplicate, Fail, NotPresent};
3 template<class T>
4 struct BTNode
5 {//二叉樹結點類
6 BTNode(const T& x){ element=x; lChild=rChild=NULL; }
7 T element;
8 BTNode* lChild,*rChild;
9 };
10 template<class T>
11 class SPTree
12 {//伸展樹類
13 public:
14 SPTree(){root=NULL;}
15 ResultCode Insert(T x);
16 void printTree(){cout<<"該樹的邊分別為:"<<endl; printTree(root);};
17 void printTree( BTNode<T>* &p){
18 if(p == NULL) return;
19 if(p->lChild != NULL){
20 cout<<" 從"<<p->element<<"到"<<p->lChild->element<<endl;
21 printTree(p->lChild);
22 }
23 if(p->rChild != NULL){
24 cout<<" 從"<<p->element<<"到"<<p->rChild->element<<endl;
25 printTree(p->rChild);
26 }
27 };
28 void printTree(int level){cout<<"該樹為:"; printTree(root, level); cout<<endl;};
29 void printTree( BTNode<T>* &p, int level){
30 if(p == NULL) return;
31 if(p->lChild != NULL){
32 printTree(p->lChild, level+1);
33 }
34 cout<<endl;
35 for(int i = 0; i<level; i++) cout<<" ";
36 cout<<p->element;
37 if(p->rChild != NULL){
38 printTree(p->rChild, level+1);
39 }
40 };
41 protected:
42 BTNode<T>* root;
43 private:
44 ResultCode Insert(BTNode<T>* &p, T x);
45 void LRot(BTNode<T>* &p);
46 void RRot(BTNode<T>* &p);
47 };
48
49 template <class T>
50 void SPTree<T>::LRot(BTNode<T>*& p)
51 { //實現向左旋轉
52 學生自己書寫部分
53 }
54 template <class T>
55 void SPTree<T>::RRot(BTNode<T>*& p)
56 { //實現向右旋轉
57 學生自己書寫部分
58 }
59
60 template <class T>
61 ResultCode SPTree<T>::Insert(T x)
62 {
63 return Insert(root, x);
64 }
65 template <class T>
66 ResultCode SPTree<T>::Insert(BTNode<T>* &p, T x)
67 {
68 學生自己書寫部分
69 }
70
71 void main(){
72 SPTree<int> tree;
73 int ele[30] = {75,89,72,42,18,25,99,90,17,33};
74 int n = 10;
75 for(int i = 0; i < n; i++) tree.Insert(ele[i]);
76 cout<<"---伸展樹程序---"<<endl<<endl;
77 cout<<"依次插入的數為:";
78 for(int j = 0; j < n; j++) cout<<ele[j]<<",";
79 tree.printTree();
80 tree.printTree(0);
81 }
程序問題:
四、實驗小結和心得