?? class.cpp
字號:
#include<iostream.h>
#include<fstream.h>
template <class T>
class Forest;
template <class T>
class TreeNode { //樹結點定義
friend Forest<T>;
private:
T data;
TreeNode<T> *fc; //指向第一個子結點
TreeNode<T> *rl; //指向右鄰兄弟
};
template <class T>
class Forest { //將森林中各棵樹的根看成兄弟
private:
TreeNode<T> *root; //指向森林中第一棵樹的根
public:
Forest() { root=0; } //構造函數中將森林初始化為空
void Insert(ifstream& in,int n,int& count) { /*輸入一個長度為n的向量,并將
該向量作為一棵子樹插入森林中的適當位置 */
T x;
TreeNode<T> *p=root,*q,*prev,*r;
for ( int i=0; i<n; i++) {
in>>x; //輸入向量中的一個數字
for (q=p,prev=0; q; prev=q,q=q->rl) /*p總是指向樹的第i+1層中由兄弟結點所構成鏈表的鏈頭。
p的初始值為root,即指向森林中各棵樹的根結點所構成的鏈表(森林中各棵樹的根看作兄弟)*/
/*指針q在p所指向的鏈表中遍歷,prev總指向q所指結點的前一結點*/
if (q->data==x) break;
/*向量的第i+1個數字在第i+1層已找到,不需要為該數字創建新結點*/
if (q==0) { //找到了向量對應子樹的插入位置,該子樹的根插入作為prev所指結點的兄弟結點*/
count++; //該向量是一個新向量,令count加1
r=new TreeNode<T>; //為該數字創建新結點
r->data=x; r->fc=0; r->rl=0;
if (prev) prev->rl=r;
//將該結點插入p所指向的鏈表的鏈尾,此時鏈尾結點由prev指向
if (p==root && !prev) root=r;
//若該結點插入前森林為空,即輸入的向量是第一個向量,令root指向新結點*/
break;
/*跳出循環執構造一棵由新結點為根,其余數字構成的單支樹,即該向量對應的子樹*/
}
else
p=q->fc; //p指向樹的下一層,轉向執行for循環輸入向量的下一個數字
}
i++;
if (i>=n) return;
prev=r;
for (; i<n; i++) { //將向量的其余數字組成一棵單支樹
in>>x;
r=new TreeNode<T>;
r->data=x; r->rl=0;
prev->fc=r;
prev=r;
}
r->fc=0;
}
};
void main() {
ifstream in("input.txt");
ofstream out("output.txt");
int count=0;
int n,m;
in>>m>>n;
Forest<int> f;
for (int i=1; i<=m; i++)
f.Insert(in,n,count);
out<<count<<endl;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -