//二叉树遍历
#include<stdio.h>
#include<malloc.h>
#include<malloc.h>
#define MaxSize 100typedef char ElemType;typedef struct node
{ElemType data;struct node * lchild;struct node * rchild;
}BTNode;void CreateBTNode(BTNode * &b,char *str) //由串str创建二叉树
{BTNode *St[MaxSize],*p=NULL;int top=-1,k,j=0;char ch;b=NULL;//创建的二叉树初始为空ch=str[j];while(ch!='\0')//str未扫描完毕,要继续循环扫描{switch(ch){case '(':top++;St[top]=p;k=1;break;//左结点case ')':top--;break;  case ',':k=2;break;  //右结点default: p=(BTNode *)malloc(sizeof(BTNode));p->data=ch;p->lchild=p->rchild=NULL;if(b==NULL) //p指向二叉树的根结点b=p;else //已建立二叉树根结点{switch(k){case 1:St[top]->lchild=p;break;case 2:St[top]->rchild=p;break;}}}j++;ch=str[j];}
}void DispBTNode(BTNode * b )  //以括号表示法输出二叉树{if(b!=NULL){printf("%c ",b->data);if(b->lchild!=NULL||b->rchild!=NULL){printf("(");DispBTNode(b->lchild);if(b->rchild!=NULL)printf(",");DispBTNode(b->rchild);printf(")");}}}void PreOrder(BTNode *b)//先序 遍历的递归算法
{if(b!=NULL){printf("%c ",b->data);//访问根节点PreOrder(b->lchild);//遍历访问左节点PreOrder(b->rchild);//遍历访问右结点}
}void PreOrder1(BTNode *b)//先序遍历的非递归算法1
{BTNode * p;struct{BTNode * pt;int tag;} St[MaxSize];int top=-1;top++;St[top].pt=b;St[top].tag=1;while(top>-1)//栈不空时 循环{if(St[top].tag==1)//不能直接访问的情况{p=St[top].pt;top--;if(p!=NULL){top++;//右孩子进栈St[top].pt=p->rchild;St[top].tag=1;top++;//左孩子进栈St[top].pt=p->lchild;St[top].tag=1;top++;//根节点进栈St[top].pt=p;St[top].tag=0;}}if(St[top].tag==0)//直接访问的情况{printf("%c ",St[top].pt->data);top--;}}
}void PreOrder2(BTNode *b)//先序遍历非递归算法2
{BTNode * St[MaxSize],*p;int top=-1;if(b!=NULL){top++;//根结点进栈St[top]=b;while(top>-1)//栈不为空时循环{p=St[top];//退栈并访问该结点top--;printf("%c ",p->data);if(p->rchild!=NULL){top++;//右孩子进栈St[top]=p->rchild;}if(p->lchild!=NULL){top++;//左孩子进栈St[top]=p->lchild;}}printf("\n");}
}void InOrder(BTNode *b) //中序遍历的递归算法
{if(b!=NULL){InOrder(b->lchild);//递归访问左子树printf("%c ",b->data);//归访问根结点InOrder(b->rchild);//递归访问右子数}
}void InOrder1(BTNode *b)//中序遍历的非递归算法一
{BTNode *p;struct{BTNode *pt;int tag;}St[MaxSize];int top=-1;top++;St[top].pt=b;St[top].tag=1;while(top>-1)  //栈不空时循环{if(St[top].tag==1) //不能直接访问的情况{p=St[top].pt;top--;if(p!=NULL){top++;   //右孩子进栈              St[top].pt=p->rchild;St[top].tag=1;top++;  //根结点进栈St[top].pt=p;St[top].tag=0;top++;  //左孩子进栈 St[top].pt=p->lchild;St[top].tag=1;}}if(St[top].tag==0)//直接访问情况  {printf("%c ",St[top].pt->data);top--;}}
}void InOrder2(BTNode *b)//中序遍历的非递归算法二
{BTNode *St[MaxSize], *p;int top=-1;   if(b!=NULL)    {p=b;while(top>-1||p!=NULL){while(p!=NULL){top++;                   St[top]=p;p=p->lchild;}if(top>-1){p=St[top];top--;printf("%c ",p->data);p=p->rchild;}}printf("\n");         }
}void PostOrder(BTNode *b)  //后序遍历的递归算法
{if(b!=NULL){PostOrder(b->lchild);//递归访问左子树PostOrder(b->rchild);//递归访问右子数printf("%c ",b->data);//访问根节点}
}void PostOrder1(BTNode *b)  //后序遍历的非递归算法一
{BTNode  *p;struct{BTNode *pt;int tag;}St[MaxSize];int top=-1;top++;St[top].pt=b;St[top].tag=1;while(top>-1)//栈不为空时循环{if(St[top].tag==1)//不能直接访问的情况{p=St[top].pt;top--;if(p!=NULL){top++;//根结点进栈St[top].pt=p;St[top].tag=0;top++;//右孩子进栈St[top].pt=p->rchild;St[top].tag=1;top++;//左孩子进栈St[top].pt=p->lchild;St[top].tag=1;}}if(St[top].tag==0)//直接访问的情况{printf("%c ",St[top].pt->data);top--;}}
}void PostOrder2(BTNode *b)//后序遍历的非递归算法二
{BTNode * St[MaxSize];BTNode *p;int flag,top=-1;//栈指针赋初值if(b!=NULL){do{while(b!=NULL)//将T的左右左节点入栈{top++;St[top]=b;b=b->lchild;}p=NULL;//P指向当前结点的前一个已经访问的结点flag=1;//设置B的访问标记为已经访问过while(top!=-1&&flag){b=St[top];//取出当前的栈顶元素if(b->rchild==p)//右子树不存在或已被访问,访问之{printf("%c ",b->data);//访问*b的结点top--;p=b;//p指向刚被访问的结点}else{b=b->rchild;//T指向右子树flag=0;//设置未被访问的标记}}}while(top!=-1);printf("\n");}
}void TravLevel(BTNode *b)//层次遍历
{BTNode *Qu[MaxSize];//定义顺序循环队列int front,rear;//定义队首和队尾指针front=rear=0;//置队列为空队列if(b!=NULL)printf("%c ",b->data);rear++;//结点指针进入队列Qu[rear]=b;while(rear!=front)//队列不为空{front=(front+1)%MaxSize;//对头出队列b=Qu[front];//队头出队列if(b->lchild!=NULL)//输出左孩子,并进入队列{printf("%c ",b->lchild->data);rear=(rear+1)%MaxSize;Qu[rear]=b->lchild;}if(b->rchild!=NULL)//输出右孩子,并进入队列{printf("%c ",b->rchild->data);rear=(rear+1)%MaxSize;Qu[rear]=b->rchild;}}printf("\n");
}int main()
{BTNode *b;CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");printf(" 二叉树B:");      DispBTNode(b);  printf("\n\n");printf("层次遍历序列: ");  TravLevel(b);   printf("\n");printf("先序遍历序列:\n");printf("   递归算法: ");      PreOrder(b);   printf("\n");printf("非递归算法1: ");    PreOrder1(b);   printf("\n");printf("非递归算法2: ");    PreOrder2(b);   printf("\n");printf("中序遍历序列:\n");printf("   递归算法: ");      InOrder(b);    printf("\n");printf("非递归算法1: ");    InOrder1(b);    printf("\n");printf("非递归算法2: ");    InOrder2(b);    printf("\n");printf("后序遍历序列:\n");printf("   递归算法: ");     PostOrder(b);   printf("\n");printf("非递归算法1: ");    PostOrder1(b);  printf("\n");printf("非递归算法2: ");    PostOrder2(b);  printf("\n");return 0;
}

数据结构源码笔记(C语言描述)汇总:

数据结构源码笔记(C语言):英文单词按字典序排序的基数排序

数据结构源码笔记(C语言):直接插入排序

数据结构源码笔记(C语言):直接选择排序

数据结构源码笔记(C语言):置换-选择算法

数据结构源码笔记(C语言):Huffman树字符编码

数据结构源码笔记(C语言):Josephus问题之顺序表

数据结构源码笔记(C语言):Josephus问题之循环链接表

数据结构源码笔记(C语言):多项式合并

数据结构源码笔记(C语言):二叉树之叶子结点旋转销毁

数据结构源码笔记(C语言):哈夫曼树

数据结构源码笔记(C语言):集合的位向量表示

数据结构源码笔记(C语言):链接队列

数据结构源码笔记(C语言):链接栈

数据结构源码笔记(C语言):线性表的单链表示

数据结构源码笔记(C语言):线性表的顺序表示

数据结构源码笔记(C语言):栈的基本操作

数据结构源码笔记(C语言):中缀表达式

数据结构源码笔记(C语言):希尔插入排序

数据结构源码笔记(C语言):索引文件建立和查找

数据结构源码笔记(C语言):冒泡排序

数据结构源码笔记(C语言):快速排序

数据结构源码笔记(C语言):可变长度字符串的快速排序

数据结构源码笔记(C语言):基数排序

数据结构源码笔记(C语言):二路归并排序

数据结构源码笔记(C语言):堆排序

数据结构源码笔记(C语言):二叉树搜索树Kruskal

数据结构源码笔记(C语言):二叉搜索树Prim

数据结构源码笔记(C语言):最短路径弗洛伊德算法

数据结构源码笔记(C语言):深度、广度优先生成树

数据结构源码笔记(C语言):邻接矩阵转化邻接表

数据结构源码笔记(C语言):统计字符串中出现的字符及其次数

数据结构源码笔记(C语言):顺序查找

数据结构源码笔记(C语言):哈希表的相关运算算法

数据结构源码笔记(C语言):分块法查找

数据结构源码笔记(C语言):二分查找

数据结构源码笔记(C语言):二叉树遍历

数据结构源码笔记(C语言):二叉平衡树的相关操作算法

数据结构源码笔记(C语言):二叉排序树的基本操作算法

数据结构源码笔记(C语言):B树的相关运算算法

数据结构源码笔记(C语言):二叉树遍历相关推荐

  1. 数据结构源码笔记(C语言描述)汇总

    数据结构源码笔记(C语言):英文单词按字典序排序的基数排序 数据结构源码笔记(C语言):直接插入排序 数据结构源码笔记(C语言):直接选择排序 数据结构源码笔记(C语言):置换-选择算法 数据结构源码 ...

  2. 数据结构源码笔记(C语言):英文单词按字典序排序的基数排序

    //实现英文单词按字典序排序的基数排序算法#include<stdio.h> #include<malloc.h> #include<string.h>#defin ...

  3. 数据结构源码笔记(C语言):索引文件建立和查找

    //实现索引文件建立和查找算法#include<stdio.h> #include<malloc.h> #include<string.h> #include< ...

  4. 数据结构源码笔记(C语言):快速排序

    //实现快速排序算法 #include<stdio.h> #include<malloc.h> #define MAXE 20typedef int KeyType; type ...

  5. 数据结构源码笔记(C语言):冒泡排序

    //冒泡排序算法实现 #include<stdio.h> #include<malloc.h> #define MAXE 20typedef int KeyType; type ...

  6. 数据结构源码笔记(C语言):希尔插入排序

    //实现希尔插入排序算法 #include<stdio.h> #include<malloc.h> #define MAXE 20typedef int KeyType; ty ...

  7. 数据结构源码笔记(C语言):直接插入排序

    //实现直接插入排序算法#include<stdio.h> #include<malloc.h> #define MAXE 20typedef int KeyType; typ ...

  8. 数据结构源码笔记(C语言):直接选择排序

    //实现直接选择排序算法#include<stdio.h> #include<malloc.h> #define MAXE 20typedef int KeyType; typ ...

  9. 数据结构源码笔记(C语言):置换-选择算法

    //实现置换-选择算法#include<stdio.h> #include<malloc.h> #include<string.h> #include<std ...

最新文章

  1. 做百度推广需要投入多少费用?
  2. mysql的B+树如何存储主键和数据,磁盘io和innodb页大小的一些问题
  3. 如何使用Java Enum
  4. JavaWeb学习总结(四十九)——简单模拟Sping MVC
  5. MySql字符串函数使用技巧
  6. Python数据挖掘与机器学习,快速掌握聚类算法和关联分析
  7. c语言 函数的参数传递示例_llround()函数以及C ++中的示例
  8. 信息学奥赛一本通 1057:简单计算器 | OpenJudge NOI 1.4 19
  9. Python实现红黑树的删除操作
  10. php friso,php binding 不兼容php7
  11. 【渝粤教育】电大中专跨境电子商务理论与实务 (30)作业 题库
  12. iOS在照片上添加水印
  13. 2018先进制造业产业发展白皮书
  14. 一页纸商业计划书 (Business Plan) 模板(转载)
  15. 图像处理之超像素分割(SLIC)
  16. 九宫格数独游戏——回溯算法——java实现
  17. iOS开发之MOVE设计模式
  18. iOS之Category和Extention的区别
  19. android加入聊天功能,app实现聊天功能 - houwanmin的个人空间 - OSCHINA - 中文开源技术交流社区...
  20. TFTP协议详细分析

热门文章

  1. c语言高中题目及答案,高中信息技术 C语言程序设计练习题 选修1
  2. C# winform 后台控制删除动态生成的控件
  3. Cache_总体介绍
  4. python搭建简单http文件服务器
  5. post from open live writer
  6. 【P1326】超级教主
  7. 一点一滴培养你的领袖气质
  8. POJ 1150 The Last Non-zero Digit 《挑战程序设计竞赛》
  9. Puppet 实验三 安装和配置
  10. 特朗普马云一起见记者 将“围绕中小企业携手做伟大的事”