#include "stdio.h" #include "malloc.h" #define datatype char typedef struct bT { datatypedata; struct bT *lt,*rt; }* bitree,BiNode; void preExCreate(bitree bt); /*递归实现*/ void FprePost(bitree bt) { if(bt) { printf("%c",bt->data); FprePost(bt->lt); FprePost(bt->rt); } } void FinPost(bitree bt) { if(bt) { FinPost(bt->lt); printf("%c",bt->data); FinPost(bt->rt); } } void FlaPost(bitree bt) { if(bt) { FlaPost(bt->lt); FlaPost(bt->rt); printf("%c",bt->data); } } /* 非递归实现 */ void prePost(bitree bt) { BiNode* stack[100]; int top=0; BiNode* p = bt; int q=0; while(top>0 || p != NULL) { while(p!=NULL) { if(p->lt ==NULL && p->rt==NULL)\ q++; printf("%c",p->data); stack[top++] = p; p = p->lt; } //左子树全部入栈 p = stack[--top]; p = p->rt; } } void inPost(bitree bt) { BiNode* stack[100]; int top=0; BiNode* p = bt; int q = 0; while(top>0 || p != NULL) { while(p!=NULL) { stack[top++] = p; p = p->lt; } //左子树全部入栈 p = stack[--top]; printf("%c",p->data); p = p->rt; } } void laPost(bitree bt) { BiNode* stack[100]; BiNode* Visted= NULL; int top=0; BiNode* p = bt; while(top>0 || p != NULL) { while(p!=NULL)// while 不是if { stack[top++] = p; p = p->lt; } //左子树全部入栈 p = stack[top-1];//取栈顶 if(p->rt == Visted || p->rt == NULL)//右子树不空或是被访问过 { printf("%c",p->data); Visted = p;//标记p被访问 --top;//栈顶出 p = NULL;//继续 右 } else { p = p->rt; } } } void Excreate (bitree* bt) { char c = getchar(); if( c == '.') (*bt) = NULL; else { (*bt) = (bitree)malloc(sizeof(BiNode)); (*bt)->data = c; Excreate(&(*bt)->lt); Excreate(&(*bt)->rt); } } void PrintTree(bitree bt,int nLayer) /* 按竖向树状打印的二叉树*/ { if(bt == NULL) return; PrintTree(bt->rt,nLayer+1); for(int i=0;i<nLayer;i++) printf(" "); printf("%c\n",bt->data); PrintTree(bt->lt,nLayer+1); } int DepthOfTree(bitree bt) { int Ld,Rd,max; if(bt != NULL) { Ld = DepthOfTree( bt->lt ); Rd = DepthOfTree( bt->rt ); max = Ld>Rd? Ld:Rd; return max+1; } else return 0; } void CCPost(bitree bt)//层次遍历 { bitree que[100]; int front=-1,rear=0; que[rear] = bt; while( front != rear) { front++;//出队 printf("%c",que[front]->data); if(que[front]->lt != NULL) { rear++; que[rear] = que[front]->lt ; //入队 } if(que[front]->rt != NULL) { rear++; que[rear] = que[front]->rt; } } } void main() { bitree bt,pre; Excreate(&bt); pre = bt; //前序遍历 printf("前序遍历:\n"); FprePost(bt); //中序 printf("\n中序遍历:\n"); FinPost(bt); printf("\n后序遍历:\n"); //后序 FlaPost(bt); printf("\n层次遍历:\n"); //层次 CCPost(bt); //横向打印二叉树 printf("\n横向打印二叉树:\n"); PrintTree(bt,DepthOfTree(bt)); //计算二叉树深度 printf("\n二叉树深度%d\n",DepthOfTree(bt)); }
二叉树的前中后以及层次遍历
原创
©著作权归作者所有:来自51CTO博客作者不怕小猫咪的原创作品,请联系作者获取转载授权,否则将追究法律责任
下一篇:哈夫曼树
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
二叉树层次遍历 python 二叉树层次遍历java
二叉树除了前序遍历、中序遍历、后序遍历之外,还有一种遍历方式,那就是层序遍历,它是将二叉树按照层次进行遍历的一种方法。
二叉树层次遍历 python java 二叉树 层序遍历 中序遍历 -
层次遍历二叉树
层次遍历二叉树,编程之美上看过解法,然后在练习了一下。用递归和vector,队列实现了,然后加上了测试函数,测试函数的二叉树创建方法待改进。
树 结点 二叉树 数组 #include -
python编写二叉树遍历 python二叉树的层次遍历
前序遍历:前序遍历算法先访问树的根节点,然后以类似的方式分别遍历左子树和右子树,如下图所示
python编写二叉树遍历 子树 后序遍历 中序遍历