先来了解一下二叉树的基本定义与性质:
三台网站制作公司哪家好,找创新互联公司!从网页设计、网站建设、微信开发、APP开发、响应式网站设计等网站项目制作,到程序开发,运营维护。创新互联公司于2013年成立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联公司。二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分 。
二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个节点 。
首先来看看二叉树的数据结构
typedef struct Tree{
char data;
struct Tree* LChild;
struct Tree* RChild;
}Tree,*LpTree;
接下来看看代码
一:递归算法
代码如下
#include#includetypedef struct Tree{
char data;
struct Tree* LChild;
struct Tree* RChild;
}Tree,*LpTree;
LpTree createNode(){
char data;
LpTree T;
scanf("%c",&data);
if(data=='*'){
return NULL;
}
else{
T=(LpTree)malloc(sizeof(Tree));
T->data=data;
T->LChild=createNode();
T->RChild=createNode();
return T;
}
}
//打印节点中的元素
void printCurNodeData(LpTree curData){
printf("%c\t",curData->data);
}
//递归法遍历 先序遍历
void xianXuBianLi(LpTree L){
if(L!=NULL){
printCurNodeData(L);
xianXuBianLi(L->LChild);
xianXuBianLi(L->RChild);
}
}
//递归法遍历 中序遍历
void zhongXuBianLi(LpTree L){
if(L!=NULL){
zhongXuBianLi(L->LChild);
printCurNodeData(L);
zhongXuBianLi(L->RChild);
}
}
//递归法遍历 后序遍历
void houXuBianLi(LpTree L){
if(L!=NULL){
houXuBianLi(L->LChild);
houXuBianLi(L->RChild);
printCurNodeData(L);
}
}
int main()
{
LpTree T;
T=createNode();
printf("先序遍历:");
xianXuBianLi(T);
printf("\n中序遍历:");
zhongXuBianLi(T);
printf("\n后序遍历:");
houXuBianLi(T);
return 0;
}
递归遍历算法结果如图所示:
输入ABC**DE*G**F***(其中*表示空子树)若有不同需求,可将代码中的*替换为其他
二:非递归算法
代码如下
#include#includetypedef struct Tree{
char data;
struct Tree* LChild;
struct Tree* RChild;
}Tree,*LpTree;
LpTree createNode(){
char data;
LpTree T;
scanf("%c",&data);
if(data=='*'){
return NULL;
}
else{
T=(LpTree)malloc(sizeof(Tree));
T->data=data;
T->LChild=createNode();
T->RChild=createNode();
return T;
}
}
//非递归先序遍历
void xianXuBianLi(LpTree L){
if(L!=NULL){
//准备栈
struct Tree* stack[10];//存储每次打印节点的位置
int stackTop=-1;//栈顶标记
LpTree pMove=L;
while(stackTop!=-1||pMove){
while(pMove){
//把路径入栈+打印走过的节点
printf("%c\t",pMove->data);
stack[++stackTop]=pMove;
pMove=pMove->LChild;
}
if(stackTop!=-1){
pMove=stack[stackTop];//获取栈顶元素
stackTop--;
pMove=pMove->RChild;
}
}
}
else{
return;
}
}
//非递归中序遍历
void zhongXuBianLi(LpTree L){
if(L!=NULL){
//准备栈
struct Tree* stack[10];//存储每次打印节点的位置
int stackTop=-1;//栈顶标记
LpTree pMove=L;
while(stackTop!=-1||pMove){
while(pMove){
stack[++stackTop]=pMove;
pMove=pMove->LChild;
}
//出栈
if(stackTop!=-1){
pMove=stack[stackTop--];
printf("%c\t",pMove->data);
pMove=pMove->RChild;
}
}
}
else{
return;
}
}
//非递归后序遍历
void houXuBianLi(LpTree L){
if(L!=NULL){
//准备栈
struct Tree* stack[10];//存储每次打印节点的位置
int stackTop=-1;//栈顶标记
LpTree pMove=L;
LpTree plastVisit=NULL;
while(pMove){
stack[++stackTop]=pMove;
pMove=pMove->LChild;
}
//出栈
while(stackTop!=-1){
pMove=stack[stackTop--];
if(pMove->RChild==NULL||pMove->RChild==plastVisit)
{
printf("%c\t",pMove->data);
plastVisit=pMove;
}
else
{
//右边未被访问
stack[++stackTop]=pMove;
pMove=pMove->RChild;
while(pMove){
stack[++stackTop]=pMove;
pMove=pMove->LChild;
}
}
}
}
else{
return;
}
}
int main()
{
LpTree T;
T=createNode();
printf("先序遍历:");
xianXuBianLi(T);
printf("\n中序遍历:");
zhongXuBianLi(T);
printf("\n后序遍历:");
houXuBianLi(T);
return 0;
}
非递归遍历算法结果如图所示:
输入ABC**DE*G**F***(其中*表示空子树)若有不同需求,可将代码中的*替换为其他
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧