二叉树非递归M

  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 }

你可能感兴趣的:(二叉树)