二叉樹的前序,中序,後序遍歷。用遞迴和非遞迴實現
阿新 • • 發佈:2018-12-06
#include<iostream>
#include<stack> using namespace std; #define MAX 100 typedef struct Tree{ int data; Tree*lchild; Tree*rchild; }*TREE,NODE; int i;//定義全域性變數 void Enter(TREE&t,int a[]); void Init(TREE &t); void Display_pre(TREE t); void Display_Pre(TREE t); void Display_mid(TREE t); void Display_Mid(TREE t); void Display_las(TREE t); void Display_Las(TREE t); int main() { TREE T=NULL; Init(T); Display_pre(T);cout<<endl;Display_Pre(T);cout<<endl<<endl; Display_mid(T);cout<<endl; Display_las(T);cout<<endl;Display_Las(T);cout<<endl; return 0; } void Enter(TREE&t,int a[]) //Init()的輔助函式,完成遞迴建立 { static int j=0; if(a[j++]) { t=new NODE; t->data=a[j-1]; t->lchild=t->rchild=NULL; Enter(t->lchild,a); Enter(t->rchild,a); } else t=NULL; } void Init(TREE &t) { int a[MAX]; FILE*fp; fp=fopen("C:\\Users\\Administrator\\Desktop\\asd.txt","r"); i=0; while(!feof(fp)) //將內容讀取到陣列中 fscanf(fp,"%d",&a[i++]); Enter(t,a); cout<<"Initialize sucessfully!"<<endl; } void Display_pre(TREE t) { if(t) {cout<<t->data<<' '; Display_pre(t->lchild); Display_pre(t->rchild); } } void Display_mid(TREE t) { if(t) { Display_mid(t->lchild); cout<<t->data<<' '; Display_mid(t->rchild); } } void Display_las(TREE t) { if(t) { Display_las(t->lchild); Display_las(t->rchild); cout<<t->data<<' '; } } void Display_Pre(TREE t) { if(!t) { cout<<"NULL!"<<endl; return; } TREE temp=t; stack<TREE> s; while((temp!=NULL)||!s.empty()) { while(temp) { cout<<temp->data<<' '; s.push(temp); temp=temp->lchild; } if(!s.empty()) { temp=s.top(); s.pop(); temp=temp->rchild; } } } void Display_Mid(TREE t) { if(t==NULL) { cout<<"NULL!"<<endl; return; } TREE temp=t; stack<TREE> s; while((temp!=NULL)||!s.empty()) { while(temp) { s.push(temp); temp=temp->lchild; } if(!s.empty()) { temp=s.top(); cout<<temp->data; s.pop(); temp=temp->rchild; } } } void Display_Las(TREE t) { if(!t) { cout<<"NULL!"<<endl; return; } TREE temp=t,temp_past=NULL;//temp為當前訪問的節點,temp_past為上一個訪問的節點 stack<TREE>s; while(temp) //移動到最底部左子樹 { s.push(temp); temp=temp->lchild; } while(!s.empty()) { temp=s.top(); s.pop(); if((temp->rchild==NULL)||(temp_past==temp->rchild)) //輸出一個根節點的條件就是其右子樹為空,或者其右子樹已經被訪問 { cout<<temp->data<<' '; temp_past=temp; } else { s.push(temp); //二次入棧 temp=temp->rchild; //進入右子樹 while(temp) { s.push(temp); temp=temp->lchild; } } } }