数据结构源码笔记(C语言):二叉树遍历
//二叉树遍历
#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语言):二叉树遍历相关推荐
- 数据结构源码笔记(C语言描述)汇总
数据结构源码笔记(C语言):英文单词按字典序排序的基数排序 数据结构源码笔记(C语言):直接插入排序 数据结构源码笔记(C语言):直接选择排序 数据结构源码笔记(C语言):置换-选择算法 数据结构源码 ...
- 数据结构源码笔记(C语言):英文单词按字典序排序的基数排序
//实现英文单词按字典序排序的基数排序算法#include<stdio.h> #include<malloc.h> #include<string.h>#defin ...
- 数据结构源码笔记(C语言):索引文件建立和查找
//实现索引文件建立和查找算法#include<stdio.h> #include<malloc.h> #include<string.h> #include< ...
- 数据结构源码笔记(C语言):快速排序
//实现快速排序算法 #include<stdio.h> #include<malloc.h> #define MAXE 20typedef int KeyType; type ...
- 数据结构源码笔记(C语言):冒泡排序
//冒泡排序算法实现 #include<stdio.h> #include<malloc.h> #define MAXE 20typedef int KeyType; type ...
- 数据结构源码笔记(C语言):希尔插入排序
//实现希尔插入排序算法 #include<stdio.h> #include<malloc.h> #define MAXE 20typedef int KeyType; ty ...
- 数据结构源码笔记(C语言):直接插入排序
//实现直接插入排序算法#include<stdio.h> #include<malloc.h> #define MAXE 20typedef int KeyType; typ ...
- 数据结构源码笔记(C语言):直接选择排序
//实现直接选择排序算法#include<stdio.h> #include<malloc.h> #define MAXE 20typedef int KeyType; typ ...
- 数据结构源码笔记(C语言):置换-选择算法
//实现置换-选择算法#include<stdio.h> #include<malloc.h> #include<string.h> #include<std ...
最新文章
- 做百度推广需要投入多少费用?
- mysql的B+树如何存储主键和数据,磁盘io和innodb页大小的一些问题
- 如何使用Java Enum
- JavaWeb学习总结(四十九)——简单模拟Sping MVC
- MySql字符串函数使用技巧
- Python数据挖掘与机器学习,快速掌握聚类算法和关联分析
- c语言 函数的参数传递示例_llround()函数以及C ++中的示例
- 信息学奥赛一本通 1057:简单计算器 | OpenJudge NOI 1.4 19
- Python实现红黑树的删除操作
- php friso,php binding 不兼容php7
- 【渝粤教育】电大中专跨境电子商务理论与实务 (30)作业 题库
- iOS在照片上添加水印
- 2018先进制造业产业发展白皮书
- 一页纸商业计划书 (Business Plan) 模板(转载)
- 图像处理之超像素分割(SLIC)
- 九宫格数独游戏——回溯算法——java实现
- iOS开发之MOVE设计模式
- iOS之Category和Extention的区别
- android加入聊天功能,app实现聊天功能 - houwanmin的个人空间 - OSCHINA - 中文开源技术交流社区...
- TFTP协议详细分析