1 #include<stdio.h> 2 #include<stdlib.h> 3 #define Stack_Size 100 4 #define StackIncrement 10 5 #define OK 1 6 #define TRUE 1 7 #define FALSE 0 8 #define ERROR 0 9 #define OVERFLOW -2 10 typedef int Status; 11 typedef char TElemType; 12 typedef struct BiTNode 13 { 14 TElemType data; 15 BiTNode *lchild,*rchild; 16 }BiTNode,*BiTree; 17 typedef struct 18 { 19 BiTree *base; 20 BiTree *top; 21 int stacksize; 22 }SqStack; 23 //构造一个顺序栈,用于存放二叉树的部分结点 24 Status InitStack(SqStack &S) 25 { 26 S.base=(BiTree *)malloc(Stack_Size*sizeof(BiTree)); 27 if(!S.base) exit(OVERFLOW); 28 S.top=S.base; 29 S.stacksize=Stack_Size; 30 return OK; 31 } 32 Status StackEmpty(SqStack &S) 33 { 34 if(S.top==S.base) 35 return TRUE; 36 return FALSE; 37 } 38 Status StackLength(SqStack S) 39 { 40 return (S.top-S.base); 41 } 42 Status GetTop(SqStack S,BiTree &e) 43 { 44 if(S.top==S.base) return ERROR; 45 e=*(S.top-1); 46 return OK; 47 } 48 Status Push(SqStack &S,BiTree e) 49 { 50 if((S.top-S.base)==S.stacksize) 51 { 52 S.base=(BiTree *)realloc(S.base,(S.stacksize+StackIncrement)*sizeof(BiTree)); 53 if(!S.base) exit(OVERFLOW); 54 S.top=S.base+S.stacksize; 55 S.stacksize+=StackIncrement; 56 } 57 *S.top++=e; 58 return OK; 59 } 60 Status Pop(SqStack &S,BiTree &e) 61 { 62 if(S.top==S.base) return ERROR; 63 e=*--S.top; 64 return OK; 65 } 66 Status PrintSqStack(SqStack S) 67 { 68 int i,length=StackLength(S); 69 for(i=length-1;i>=0;i--) 70 printf("%c",S.base[i]->data); 71 putchar('\n'); 72 return OK; 73 } 74 //构造一个二叉树 75 Status CreateBiTree(BiTree &T) 76 { 77 char ch; 78 ch=getchar(); 79 if(ch==' ') T=NULL; 80 else{ 81 if(!(T=new BiTNode)) exit(OVERFLOW); 82 T->data=ch; 83 CreateBiTree(T->lchild); 84 CreateBiTree(T->rchild); 85 } 86 return OK; 87 } 88 //前中后序遍历二叉树 89 Status PreOrderTraverse(BiTree T) 90 { 91 SqStack S; 92 BiTree p; 93 InitStack(S); 94 p=T; 95 while(p||!StackEmpty(S)) 96 { 97 if(p) {printf("%c",p->data);Push(S,p);p=p->lchild;} 98 else 99 { 100 Pop(S,p); 101 p=p->rchild; 102 } 103 } 104 return OK; 105 } 106 Status InOrderTraverse(BiTree T) 107 { 108 SqStack S; 109 BiTree p; 110 InitStack(S); 111 p=T; 112 while(p||!StackEmpty(S)) 113 { 114 if(p) {Push(S,p);p=p->lchild;} 115 else 116 { 117 Pop(S,p); 118 printf("%c",p->data); 119 p=p->rchild; 120 } 121 } 122 return OK; 123 } 124 Status PostOrderTraverse(BiTree T) 125 { 126 SqStack S1,S2; 127 BiTree p; 128 InitStack(S1);InitStack(S2); 129 p=T; 130 while(p||!StackEmpty(S1)) 131 { 132 if(p) {Push(S2,p);Push(S1,p);p=p->rchild;} 133 else 134 { 135 Pop(S1,p); 136 p=p->lchild; 137 } 138 } 139 PrintSqStack(S2); 140 return OK; 141 } 142 //求叶子结点个数和二叉树的深度 143 Status CountLeaf(BiTree T) 144 { 145 int count=0; 146 if(T) 147 { 148 if((!T->lchild)&&(!T->rchild)) 149 count++; 150 count+=CountLeaf( T->lchild); 151 count+=CountLeaf( T->rchild); 152 } 153 return count; 154 } 155 Status Depth(BiTree T) 156 { 157 int depthval=0; 158 int depthLeft,depthRight; 159 if(!T) depthval = 0; 160 else 161 { 162 depthLeft = Depth( T->lchild ); 163 depthRight= Depth( T->rchild ); 164 depthval = 1 + (depthLeft > depthRight ? depthLeft : depthRight); 165 } 166 return depthval; 167 } 168 Status main() 169 { 170 BiTree T; 171 int count,depthval; 172 puts("请前序输入二叉树:"); 173 CreateBiTree(T); 174 puts("前序输出二叉树:"); 175 PreOrderTraverse(T); 176 puts("\n中序输出二叉树:"); 177 InOrderTraverse(T); 178 puts("\n后序输出二叉树:"); 179 PostOrderTraverse(T); 180 count=CountLeaf(T); 181 printf("统计叶子的个数为:%d\n",count); 182 depthval=Depth(T); 183 printf("统计树的深度为:%d\n",depthval); 184 system("pause"); 185 return OK; 186 }
相关文章: