二叉树周游

lastOne.h

  1 #ifndef __lastOne_H__
  2 #define __lastOne_H__
  3 #include <iostream>
  4 #include <stdio.h>   
  5 #include <stdlib.h>  
  6 typedef char TElemType;
  7 using namespace std;
  8 typedef struct BiTNode {
  9     TElemType data;
 10     struct BiTNode *lchild,*rchild;
 11 } BiTNode,*BiTree;
 12 struct Node;
 13 typedef struct Node * PNode;
 14 typedef int DataType;
 15 struct Node{
 16     BiTree bnode;
 17     PNode link;
 18 };
 19 struct LinkStack{
 20     PNode top;
 21 };
 22 typedef struct LinkStack * PLinkStack;
 23 PLinkStack createEmptyStack_link(void);
 24 int isEmptyStack_link(PLinkStack plstack);
 25 void push_link(PLinkStack plstack,BiTree x);
 26 BiTree pop_link(PLinkStack plstack);
 27 void CreateBiTree(BiTree &T);
 28 void recPostOrderTraverse(BiTree T);
 29 void recInOrderTraverse(BiTree T);
 30 void recPreOrderTraverse(BiTree T);
 31 void InOrderTraverse(BiTree T);
 32 void PreOrderTraverse(BiTree T);
 33 void PostOrderTraverse(BiTree T);
 34 void menu();
 35 void childrenLeaves(BiTree T);
 36 void printChildrenLeaves(BiTree T);
 37 int Depth(BiTree T);
 38 int NodeCount(BiTree T);
 39 int sum=0;
 40 void printChildrenLeaves(BiTree T){
 41     if(T==NULL){
 42     }
 43     else{
 44         if(T->lchild||T->rchild){
 45             printChildrenLeaves(T->lchild);
 46             printChildrenLeaves(T->rchild);
 47         }
 48         else{
 49             cout<<T->data;
 50             printChildrenLeaves(T->lchild);
 51             printChildrenLeaves(T->rchild);
 52         }
 53     }
 54 }
 55 void childrenLeaves(BiTree T){
 56     if(T==NULL){
 57     }
 58     else{
 59         if(T->lchild!=NULL&&T->rchild!=NULL){
 60             sum++;
 61             childrenLeaves(T->lchild);
 62             childrenLeaves(T->rchild);
 63         }
 64     }
 65 }
 66 int Depth(BiTree T){
 67     int n,m;
 68     if(T==NULL)
 69         return 0;
 70     else {
 71         m=Depth(T->lchild);
 72         n=Depth(T->rchild);
 73         if(m>n)
 74             return(m+1);
 75         else
 76             return(n+1);
 77     }
 78 }
 79 int NodeCount(BiTree T){
 80     if(T==NULL)
 81         return 0;
 82     else
 83         return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
 84 }
 85 void menu(){
 86     cout<<"1.recPre\n2.recIn\n3.recPost\n4.pre\n5.in\n6.post\n7.depth\n8.leaves\n9.childrenLeaves\n10.printChildrenLeaves\n";
 87 }
 88 void recPreOrderTraverse(BiTree T){
 89     if(T){
 90         cout<<T->data;
 91         recPreOrderTraverse(T->lchild);
 92         recPreOrderTraverse(T->rchild);
 93     }
 94 }
 95 void recInOrderTraverse(BiTree T){
 96     if(T){
 97         recInOrderTraverse(T->lchild);
 98         cout<<T->data;
 99         recInOrderTraverse(T->rchild);
100     }
101 }
102 void recPostOrderTraverse(BiTree T){
103     if(T){
104         recPostOrderTraverse(T->lchild);
105         recPostOrderTraverse(T->rchild);
106         cout<<T->data;
107     }
108 }
109 void CreateBiTree(BiTree &T){  
110     char ch;  
111     scanf("%c",&ch);  
112     if(ch=='#'){  
113         T=NULL;  
114         return;  
115     }  
116     else{  
117         T=(BiTree)malloc(sizeof(BiTNode));  
118         if(!T)exit(1);  
119         T->data=ch;  
120         CreateBiTree(T->lchild);  
121         CreateBiTree(T->rchild);  
122     }  
123 }  
124 void InOrderTraverse(BiTree T){     
125     PLinkStack plstack=createEmptyStack_link();
126     if(!T){  
127         printf("empty tree£¡\n");  
128         return;  
129     }  
130     while(T||!isEmptyStack_link(plstack)){  
131         while(T){  
132             push_link(plstack,T); 
133             T=T->lchild;  
134         }
135         T=pop_link(plstack); 
136         printf("%c",T->data);  
137         T=T->rchild;  
138     }                                                                                                                                     
139 }  
140 void PreOrderTraverse(BiTree T){  
141     PLinkStack plstack=createEmptyStack_link();  
142     if(!T){  
143         printf("empty tree£¡\n");  
144         return;  
145     }  
146     while(T||!isEmptyStack_link(plstack)){  
147         while(T){  
148             push_link(plstack,T);  
149             printf("%c",T->data);  
150             T=T->lchild;  
151         }
152         T=pop_link(plstack);       
153         T=T->rchild;          
154     }                                                                                                                                     
155 }  
156 void PostOrderTraverse(BiTree T){
157     PLinkStack plstack=createEmptyStack_link();  
158     BiTree p=T;
159     BiTree t;
160     while(p!=NULL||!isEmptyStack_link(plstack)){
161         while(p!=NULL){
162             push_link(plstack,p); 
163             p=p->lchild?p->lchild:p->rchild;
164         }
165         p=pop_link(plstack);
166         printf("%c",p->data);
167         if(plstack->top!=NULL)t=plstack->top->bnode;
168         if(!isEmptyStack_link(plstack)&&t->lchild==p){
169             p=t->rchild;
170         }
171         else p=NULL;
172     }
173 }
174 PLinkStack createEmptyStack_link(void){
175     PLinkStack plstack;
176     plstack=(PLinkStack)malloc(sizeof(struct LinkStack));
177     if(plstack!=NULL){
178         plstack->top=NULL;
179         printf("succeed\n");
180     }
181     else
182         printf("out of space\n");
183     return plstack;
184 }
185 int isEmptyStack_link(PLinkStack plstack){
186     return (plstack->top==NULL);
187 }
188 void push_link(PLinkStack plstack,BiTree T){
189     PNode p;
190     p=(PNode)malloc(sizeof(struct Node));
191     if(p==NULL)printf("out of space\n");
192     else{
193         p->bnode=T; 
194         p->link=plstack->top;
195         plstack->top=p;
196     }
197 }
198 BiTree pop_link(PLinkStack plstack){
199     PNode p;
200     if(isEmptyStack_link(plstack)) printf("Empty stack pop\n");
201     else{
202         BiTree num;
203         num=plstack->top->bnode;
204         p=plstack->top;
205         plstack->top=plstack->top->link;
206         free(p);
207         return num;
208     }
209 }
210 #endif    

accept_linkTree_traverse

 1 //ab#c###
 2 //ab##cdf###e##
 3 //ABD#G###CE##FH###
 4 #include"lastOne.h"
 5 int main() 
 6 {
 7     BiTree a;
 8     int height,num;
 9     int in;
10     cout<<"please all the elements\n";
11     CreateBiTree(a);
12     num=NodeCount(a);
13     menu();
14     while(1){
15         scanf("%d",&in);
16         switch(in){
17         case 1:
18             cout<<"recPre:";
19             recPreOrderTraverse(a);
20             cout<<"\n";
21             break; 
22         case 2:
23             cout<<"recIn:";
24             recInOrderTraverse(a);
25             cout<<"\n";
26             break; 
27         case 3:
28             cout<<"recPost:";
29             recPostOrderTraverse(a);
30             cout<<"\n";
31             break; 
32         case 4:
33             cout<<"pre:";
34             PreOrderTraverse(a);
35             cout<<"\n";
36             break; 
37         case 5:
38             cout<<"in:";
39             InOrderTraverse(a);
40             cout<<"\n";
41             break;
42         case 6:
43             cout<<"post:";
44             PostOrderTraverse(a);
45             cout<<"\n";
46             break;    
47         case 7:
48             cout<<"depth:";
49             height=Depth(a);
50             cout<<height<<endl;
51             cout<<"\n";
52             break;
53         case 8:
54             cout<<"leaves:";
55             num=NodeCount(a);
56             cout<<num;
57             cout<<"\n";
58             break;
59         case 9:
60             cout<<"childrenLeaves:";
61             childrenLeaves(a);
62             cout<<sum+1;
63             cout<<"\n";
64             break;
65         case 10:
66             cout<<"printChildrenLeaves:";
67             printChildrenLeaves(a);
68             cout<<"\n";
69             break;
70         } 
71     }
72     return 0;
73 }

posted @ 2018-05-06 19:54  f--  阅读(392)  评论(0编辑  收藏  举报