层序遍历二叉树
//利用队列来实现层序遍历,先让根结点入队,之后,每次从队头出队一个结点并访问,同时将该结点左孩子与右孩子入队(如果非空的话),循环直到队空
1 //Level Order Traverse 2 #include<iostream> 3 #define MAX 100 4 using namespace std; 5 6 typedef struct BiTNode{ 7 int data; 8 struct BiTNode *lChild,*rChild; 9 }BiTNode,*BiTree; 10 11 typedef struct{ 12 BiTree data[MAX]; 13 int front,rear; 14 }Queue; 15 16 bool levelOrderTraverse(BiTree &T){ 17 //initialQueue(Q) 18 Queue Q; 19 Q.front=0; 20 Q.rear=0; 21 //EnQueue(Q,T) 22 Q.data[Q.rear++]=T; 23 BiTree p=NULL; 24 //while(!QueueEmpty(Q)) 25 while(Q.front!=Q.rear){ 26 //DeQueue(Q,p) 27 p=Q.data[Q.front]; 28 Q.front=(Q.front+1)%MAX; 29 if(p){ 30 //visit(p->data) 31 cout<<p->data<<" "; 32 //EnQueue(p->lChild)//EnQueue(p->rChild) 33 Q.data[Q.rear]=p->lChild; 34 Q.rear=(Q.rear+1)%MAX; 35 Q.data[Q.rear]=p->rChild; 36 Q.rear=(Q.rear+1)%MAX; 37 } 38 } 39 } 40 41 bool PreAndInCreate(BiTree &T,int pre[],int in[],int length){ 42 if(0==length){ 43 T=NULL; 44 }else{ 45 int i; 46 T=new BiTNode; 47 T->data=pre[0]; 48 for(i=0;i<length&&in[i]!=pre[0];++i); 49 if(i>length) return false; 50 PreAndInCreate(T->lChild,pre+1,in,i); 51 PreAndInCreate(T->rChild,pre+i+1,in+i+1,length-i-1); 52 } 53 return true; 54 } 55 56 void deleteTree(BiTree &T){ 57 if(T){ 58 BiTree L,R; 59 L=T->lChild; 60 R=T->rChild; 61 delete T; 62 T=NULL; 63 deleteTree(L); 64 deleteTree(R); 65 } 66 } 67 68 int main(){ 69 int n; 70 cout<<"Input the number of nodes:"; 71 cin>>n; 72 int pre[n],in[n]; 73 cout<<"Input the preorder:"; 74 for(int i=0;i<n;++i){ 75 cin>>pre[i]; 76 } 77 cout<<"Input the inorder:"; 78 for(int i=0;i<n;++i){ 79 cin>>in[i]; 80 } 81 BiTree T=NULL; 82 if(PreAndInCreate(T,pre,in,n)){ 83 cout<<"\nthe level-order tree is "; 84 levelOrderTraverse(T); 85 }else cout<<"invalid input"<<endl; 86 deleteTree(T); 87 }

递归算法 思路:如果要访问根为root的树的第k层,即为访问root左子树第k-1层和右子树第k-1层,基本项为层数是1以及层数是0的时候,前者直接访问结点,后者直接返回
Look, if you had one shot , one opportunity , to seize everything you ever wanted , in one moment.
Would you captrue it , or just let it slip ?

浙公网安备 33010602011771号