标签:
原文地址:http://blog.csdn.net/zhaoxianyong/article/details/7165386
1 #include "stdafx.h" 2 #include "stdlib.h" 3 4 struct BiTreeNode 5 { 6 int c; 7 struct BiTreeNode *left; 8 struct BiTreeNode *right; 9 }; 10 11 //先序遍历--递归 12 int traverseBiTreePreOrder(BiTreeNode *ptree,int (*visit)(int)) 13 { 14 if(ptree) 15 { 16 if(visit(ptree->c)) 17 if(traverseBiTreePreOrder(ptree->left,visit)) 18 if(traverseBiTreePreOrder(ptree->right,visit)) 19 return 1; 20 21 return 0; 22 }else return 1; 23 } 24 25 //中序遍历--递归 26 int traverseBiTreeInOrder(BiTreeNode *ptree,int (*visit)(int)) 27 { 28 if(ptree) 29 { 30 if(traverseBiTreeInOrder(ptree->left,visit)) 31 if(visit(ptree->c)) 32 if(traverseBiTreeInOrder(ptree->right,visit)) 33 return 1; 34 return 0; 35 }else return 1; 36 } 37 38 //后序遍历--递归 39 int traverseBiTreePostOrder(BiTreeNode *ptree,int(*visit)(int)) 40 { 41 if(ptree) 42 { 43 if(traverseBiTreePostOrder(ptree->left,visit)) 44 if(traverseBiTreePostOrder(ptree->right,visit)) 45 if(visit(ptree->c)) 46 return 1; 47 return 0; 48 }else return 1; 49 } 50 //visit为一函数指针,用于传递二叉树中对结点的操作方式,其原型为:int (*visit)(char)。 51 52 //定义栈,用于使用非递归方法遍历二叉树 53 struct Stack 54 { 55 BiTreeNode **top; 56 BiTreeNode **base; 57 int size; 58 }; 59 #define STACK_INIT_SIZE 100 60 #define STACK_INC_SIZE 10 61 //初始化空栈 62 Stack * initStack() 63 { 64 Stack *qs = NULL; 65 qs = (Stack *)malloc(sizeof(Stack)); 66 qs->base = (BiTreeNode ** )calloc(STACK_INIT_SIZE,sizeof(BiTreeNode*)); 67 qs->top = qs->base; 68 qs->size = STACK_INIT_SIZE; 69 return qs; 70 } 71 //取栈顶数据 72 BiTreeNode* getTop(Stack *qs) 73 { 74 BiTreeNode *ptree = NULL; 75 if(qs->top == qs->base) 76 return NULL; 77 ptree = *(qs->top-1); 78 return ptree; 79 } 80 //入栈操作 81 int push(Stack *qs,BiTreeNode *ptree) 82 { 83 if(qs->top - qs->base >= qs->size) 84 { 85 qs->base = (BiTreeNode **)realloc(qs->base,(qs->size + STACK_INC_SIZE)*sizeof(BiTreeNode*)); 86 qs->top = qs->base + qs->size; 87 qs->size += STACK_INC_SIZE; 88 } 89 *qs->top ++= ptree; 90 return 1; 91 } 92 //出栈操作 93 BiTreeNode* pop(Stack *qs) 94 { 95 if(qs->top == qs->base) 96 return NULL; 97 return *--qs->top; 98 } 99 //判断栈是否为空 100 int isEmpty(Stack *qs) 101 { 102 return qs->top == qs->base; 103 } 104 105 //先序遍历--非递归 106 int traverseBiTreePreOrder2(BiTreeNode *ptree,int(*visit)(int)) 107 { 108 Stack *qs = NULL; 109 BiTreeNode *pt = NULL; 110 qs = initStack(); 111 pt = ptree; 112 while(pt|| !isEmpty(qs)) 113 { 114 if(pt) 115 { 116 if(!visit(pt->c)) return 0; 117 push(qs,pt->right); 118 pt = pt->left; 119 } 120 else pt = pop(qs); 121 } 122 return 1; 123 } 124 //中序遍历--非递归 125 int traverseBiTreeInOrder2(BiTreeNode* ptree,int (*visit)(int)) 126 { 127 Stack *qs = NULL; 128 BiTreeNode *pt = NULL; 129 qs = initStack(); 130 pt = ptree; 131 while(pt||!isEmpty(qs)) 132 { 133 if(pt) 134 { 135 push(qs,pt); 136 pt = pt->left; 137 } 138 else 139 { 140 pt = pop(qs); 141 if(!visit(pt->c)) return 0; 142 pt = pt->right; 143 } 144 } 145 return 1; 146 } 147 //中序遍历--非递归--另一种实现方式 148 int traverseBiTreeInOrder3(BiTreeNode *ptree,int(*visit)(int)) 149 { 150 Stack *qs = NULL; 151 BiTreeNode *pt = NULL; 152 qs = initStack(); 153 push(qs,ptree); 154 while(!isEmpty(qs)) 155 { 156 while(pt = getTop(qs)) push(qs,pt->left); 157 pt = pop(qs); 158 if(!isEmpty(qs)) 159 { 160 pt = pop(qs); 161 if(!visit(pt->c))return 0; 162 push(qs,pt->right); 163 } 164 } 165 return 1; 166 } 167 //后序遍历--非递归 168 int traverseBiTreePostOrder2(BiTreeNode *ptree,int (*visit)(int)) 169 { 170 Stack *qs = NULL; 171 BiTreeNode *pt = NULL; 172 qs = initStack(); 173 pt = ptree; 174 while(1) 175 { 176 if(pt) 177 { 178 push(qs,pt); 179 push(qs,pt->right); 180 pt = pt->left; 181 } 182 else if(!pt) 183 { 184 pt = pop(qs); 185 if(!pt) 186 { 187 pt = pop(qs); 188 if(!visit(pt->c)) return 0; 189 if(isEmpty(qs))return 1; 190 pt = pop(qs); 191 } 192 push(qs,NULL); 193 } 194 } 195 return 1; 196 } 197 //创建二叉树--先序输入--递归 198 BiTreeNode* createBitreePreOrder() 199 { 200 BiTreeNode *ptree = NULL; 201 char ch; 202 ch = getchar(); 203 if(ch == ‘ ‘) 204 ptree = NULL; 205 else 206 { 207 ptree = (struct BiTreeNode *) malloc(sizeof(BiTreeNode)); 208 ptree->c = ch; 209 ptree->left = createBitreePreOrder(); 210 ptree->right = createBitreePreOrder(); 211 } 212 return ptree; 213 } 214 int _tmain(int argc, _TCHAR* argv[]) 215 { 216 BiTreeNode *proot = NULL; 217 printf("InOrder input chars to create a Bitree:"); 218 proot = createBitreePreOrder();// 先序输入的格式:ABC^^DE^G^^F^^^(其中^表示空格字符) 219 printf("PreOrder Output the Bitree recursively:"); 220 traverseBiTreePreOrder(proot,putchar); 221 printf("\n"); 222 printf("PreOrder Output the BiTree non-recursively: "); 223 traverseBiTreePreOrder2(proot,putchar); 224 printf("\n"); 225 printf("InOrder Output the BiTree recursively: "); 226 traverseBiTreeInOrder(proot,putchar); 227 printf("\n"); 228 printf("InOrder Output the BiTree non-recursively(1): "); 229 traverseBiTreeInOrder2(proot,putchar); 230 printf("\n"); 231 printf("InOrder Output the BiTree non-recursively(2): "); 232 traverseBiTreeInOrder3(proot,putchar); 233 printf("\n"); 234 printf("PostOrder Output the BiTree non-recursively: "); 235 traverseBiTreePostOrder(proot,putchar); 236 printf("\n"); 237 printf("PostOrder Output the BiTree recursively: "); 238 traverseBiTreePostOrder2(proot,putchar); 239 printf("\n"); 240 241 system("pause"); 242 return 0; 243 }
输出:
标签:
原文地址:http://www.cnblogs.com/nightcatcher/p/4466983.html