第五章內容小結
阿新 • • 發佈:2019-05-05
搜索 put 訪問 empty post ash 先序 先序遍歷 操作
在第五章,我們學習了樹這個數據結構,並且學習了其定義、遍歷等操作,最後還學習了哈夫曼樹。
一.樹的遍歷
樹的遍歷操作有以下三種:
1。先序遍歷(根,左孩子,右孩子)
void PreOrderTravel(node t[], int x) { cout << t[x].name << " "; if(t[x].lch!=-1) PreOrderTravel(t, t[x].lch); if(t[x].rch!=-1) PreOrderTravel(t, t[x].rch); }
2。中序遍歷(左孩子,根,右孩子)
voidInOrderTravel(node t[], int x) { if(t[x].lch!=-1) InOrderTravel(t, t[x].lch); cout << t[x].name << " "; if(t[x].rch!=-1) InOrderTravel(t, t[x].rch); }
3。後序遍歷(左孩子,右孩子,根)
void PostOrderTravel(node t[], int x) { if(t[x].lch!=-1) PostOrderTravel(t, t[x].lch);if(t[x].rch!=-1) PostOrderTravel(t, t[x].rch); cout << t[x].name << " "; }
二.實踐遇到的問題。
針對“深入虎穴”這道編程題,看到輸入格式的時候一開始有點懵,不知道怎麽將這樣的輸入方式與樹這個數據結構相契合。
但後來在老師帶領下,明白了這個輸入格式所對應的邏輯圖。
然後建立結點。
typedef struct{ int doors;//門的數量 int *p;//p指向門的編號,將p看作是整型數組 }node;
然後主函數。
int main(){ node *a; int i,j,k,root; root = input(a); cout<< find(a,root)<<endl; return 0; }
輸入和尋找是最大的問題,一開始在find函數中還把循環裏的i<a[x]寫成了i<=a[x],導致溢出,無論怎樣測試都不對
int input(node *&a) { int n,i,x,j; bool *vi; cin>>n; a = new node[n+1];//為a數組申請空間。 vi= new bool[n+1]; for(i=1;i<=n;i++) {//初始化vi為false vi[i]=false; } for(i=1;i<=n;++i) { cin>> x; a[i].doors=x; a[i].p=new int[x]; for(j=0;j<x;++j)//new的空間為x,x的有效下標為0~x—1,故循環從0開始。 { cin>>a[i].p[j]; vi[a[i].p[j]]=true; } } //找出根在數組的下標 for(i=1;i<=n;++i) { if(!vi[i])break; } return i; } int find(node *a,int root) { //從a數組的下標向下搜索 queue<int>q;//定義用於待訪問的門編號的隊列。 //根編號入隊 q.push(root); int x,i; //當隊列不為空 //x = 出隊 //x後的門編號入隊 while(!q.empty()){ x=q.front(); q.pop(); for(i=0 ; i<a[x].doors;++i) { q.push(a[x].p[i]); } } //答案為x return x; }
做完這道題以後,就覺得自己分析問題不夠清晰,思路有些混亂,然後做題過程中十分粗心、大意。
還需要多多練習,多敲代碼,繼續整理筆記,理清思路。
第五章內容小結