代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
C
】
用递归和非递归方法遍历二叉树的前,中,后序
作者:
青田
/ 发布于
2013/5/6
/
743
#include<stdio.h> #include<stdlib.h> #include<string.h> #define NULLKY '#' #define MAX_NODE 200 char a[MAX_NODE]; typedef struct BTNode{ char data; struct BTNode *Lchild,*Rchild; int flag; }BTNode,*BiTree; typedef struct Stack { BiTree tree[20]; int top,bottom; }Stack,*StackList; StackList InitStack() { StackList Stack; Stack=(StackList)malloc(sizeof(Stack)); if(Stack==NULL) { printf("内存分配失败!!"); exit(0); } else { Stack->top=0; Stack->bottom=0; } return Stack; } //按先序序列创建二叉树 int CreateBiTree(BiTree &T,int &index,int &n){ if(index == n){ return 0; } //按先序次序输入二叉树中结点的值(一个字符),‘#’表示空树 if(a[index] ==NULLKY){ T = NULL; index++; } else{ T = (BiTree)malloc(sizeof(BTNode)); //生成根结点 T->data = a[index]; index++; //构造左子树 CreateBiTree(T->Lchild,index,n); //构造右子树 CreateBiTree(T->Rchild,index,n); } return 0; } //输出二叉树序列 void Print(BiTree T) { if(T->data!=NULLKY) printf("%c ",T->data); } //递归法先序遍历 int PreOrder(BiTree T){ if(T != NULL){ //访问根节点 Print(T); //访问左结点 PreOrder(T->Lchild); //访问右结点 PreOrder(T->Rchild); } return 0; } //递归法中序遍历 int InOrder(BiTree T){ if(T != NULL){ //访问左结点 InOrder(T->Lchild); //访问根节点 Print(T); //访问右结点 InOrder(T->Rchild); } return 0; } //递归法后序遍历 int PostOrder(BiTree T){ if(T!=NULL){ //访问左结点 PostOrder(T->Lchild); //访问右结点 PostOrder(T->Rchild); //访问根节点 Print(T); } return 0; } //非递归法先序遍历 void PreorderTraverse(BiTree T,StackList Stack){ while(Stack->top||T){ if(T){ printf("%c ",T->data); Stack->tree[Stack->top]=T; Stack->top=Stack->top+1; T=T->Lchild;} else{ Stack->top--; T=Stack->tree[Stack->top]; T=T->Rchild; } } } //非递归法中序遍历 void InorderTraverse(BiTree T,StackList Stack){ do { while(T) { Stack->tree[Stack->top]=T; Stack->top=Stack->top+1; T=T->Lchild; } if(Stack->top) { Stack->top--; T=Stack->tree[Stack->top]; printf("%c ",T->data); T=T->Rchild; } }while(Stack->top||T); } //非递归法后序遍历 void PostorderTraverse(BiTree T,StackList Stack){ while(T ||Stack->top){ if(T){ if(T->flag==1 ){ T->flag = 2; //此时将flag设置成2可让下一次调用此函数访问此二叉树不受影响 printf("%c ",T->data); if(!Stack->top) break; Stack->top--; T=Stack->tree[Stack->top]; } else { T->flag = 1; Stack->tree[Stack->top]=T; Stack->top=Stack->top+1; Stack->tree[Stack->top]=T->Rchild; Stack->top=Stack->top+1; T = T->Lchild; } } else {Stack->top--; T=Stack->tree[Stack->top]; } } } int main(){ int length,i; while(scanf("%s",a)!=EOF){ BiTree T; StackList stack; stack=InitStack(); length=strlen(a); i=0; CreateBiTree(T,i,length); printf("递归算法的前,中,后序遍历结果是:\n"); PreOrder(T); printf("\n"); InOrder(T); printf("\n"); PostOrder(T); printf("\n"); printf("非递归算法的前,中,后序遍历结果是:\n"); PreorderTraverse(T,stack); printf("\n"); InorderTraverse(T,stack); printf("\n"); PostorderTraverse(T,stack); printf("\n"); } system("pause"); return 0; }
试试其它关键字
递归和非递归
同语言下
.
获取手机通讯录 iOS去除数字以外的所有字符
.
异步加载音乐等资源
.
交通罚单管理系统
.
freemark实现,简单的替换
.
计算斐波那契数列
.
base64解码 包括解码长度
.
图像显示
.
冒泡排序
.
输入十进制数,输出指定进制
.
链式栈
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
青田
贡献的其它代码
(
1
)
.
用递归和非递归方法遍历二叉树的前,中,后序
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3