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 }