问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求二叉树的非递归后序遍历的c语言代码?3

发布网友 发布时间:2023-10-13 12:52

我来回答

2个回答

热心网友 时间:2024-12-04 21:52

#include<iostream>
#include<stdio.h>
#define N 10
using namespace std;

char *a;

typedef struct NODE{
char data;
struct NODE *lch, *rch,*parent;
} *BINTREE,Node;

void visit(char data){

printf("%5c",data);
}

void preorder(BINTREE T){ // 先根序周游
BINTREE stack[50];
BINTREE p;
p=T;
int s=0;
if(p==NULL)return;
while(1)
{ visit(p->data);
while(p->lch!=NULL) {
stack[++s]=p;
p=p->lch;
visit(p->data); }
// cout<<" "<<s;
while(1)
{ if((p=p->rch)!=NULL)
break;
if(s==0)
return;
p=stack[s--];
}
}
}

void inorder(BINTREE T)//中根序周游
{
Node *stack[100];
int top=0;
stack[0]=T;
while(top>0 ||stack[top]!=NULL)
{
while(stack[top]!=NULL)
{
stack[++top]=stack[top]->lch ;
}
if(top>0)
{
printf("%5c",stack[--top]->data );
stack[top]=stack[top]->rch ;
}
}

}

void posorder1(BINTREE T)//后根序周游
{
Node *stack[100];
int top=0;
int tag[100];
tag[0]=0;
stack[0]=T;
do
{
while(stack[top]!=NULL)
{
stack[++top]=stack[top]->lch ;
tag[top]=0;
}
while(tag[top-1]==1)
printf("%5c",stack[--top]->data );
if(top>0)
{
stack[top]=stack[top-1]->rch ;
tag[top-1]=1;
tag[top]=0;
}
} while(top!=0);

}

BINTREE Create(){//先根序树的建立
BINTREE T;
char ch;
cin>>ch;
cout<<" ch="<<ch<<endl;
if(ch=='#')
T=NULL;
else{
if(!(T=(BINTREE )malloc(sizeof(Node))))
printf("Error!");
T->data=ch;
T->lch=Create();
T->rch=Create();
}
return T;
}

void main(){

freopen("D:\\input.txt","r",stdin);
BINTREE T;
T=Create();
cout<<"先根序遍历 ";
preorder(T);
cout<<endl;

cout<<"中根序遍历 ";
inorder(T);
cout<<endl;

cout<<"后根序遍历 ";
posorder1(T);
cout<<endl;
cout<<endl;

}
在D盘建立一个input.txt的文件,输入数的内容,输入顺序为先序根遍历的顺序,叶子节点的left和right用#代替即可。

热心网友 时间:2024-12-04 21:52

#include "stdio.h"
#include "stdlib.h"

typedef char DataType;
struct BinTreeNode
{
DataType info;
struct BinTreeNode *llink, *rlink;
};
typedef struct BinTreeNode *PBinTreeNode;

#define MAXNUM 128
typedef struct
{
PBinTreeNode ptr; /*结点地址进栈*/
int tag; /*特征位:第一次进栈时置0,第二次进栈时置1*/
}Elem;
struct SeqStack
{
Elem s[MAXNUM];
int t;
};
typedef struct SeqStack *PSeqStack;

PSeqStack createEmptyStack_seq(void)
{
PSeqStack pastack;
pastack=(PSeqStack)malloc(sizeof(struct SeqStack));
if(!pastack)
printf("内存溢出\n");
else
pastack->t=-1;
return pastack;
}

int isEmptyStack_seq(PSeqStack pastack)
{
return (pastack->t==-1);
}

void push_seq(PSeqStack pastack, Elem x)
{
if(pastack->t>=MAXNUM-1)
printf("栈发生了上溢!\n");
else
{
pastack->t=pastack->t+1;
pastack->s[pastack->t]=x;
}
}

void pop_seq(PSeqStack pastack)
{
if( isEmptyStack_seq(pastack) )
printf("栈发生了下溢!\n");
else
pastack->t=pastack->t-1;
}

Elem top_seq(PSeqStack pastack)
{
Elem temp={NULL,-1};
if( isEmptyStack_seq(pastack) )
{
printf("栈发生了下溢!\n");
return(temp);
}
else
return (pastack->s[pastack->t]);
}

/*后序周游的方法:遇到一个结点,把它推入栈中,去周游它的左子树;周游
遍它的左子树后,还不能马上访问处于栈顶的结点,而是要按照它的右指针
指示的地址去周游该结点的右子树;周游遍右子树后才能从栈顶托出该结点
并访问之。因此需要给栈中的每个元素加上一个特征位,以便当从栈顶托出
一个结点时区别是从栈顶元素左边回来的(则要继续周游右子树),还是从
右边回来的(该结点的左、右子树均已周游,则要访问该结点)。进入左子
树该结点的特征位置0;进入右子树该结点的特征位置1。返回时,特征位为
0表示从左边回来;特征位为1表示从右边回来。*/
void postOrder(PBinTreeNode root)
{
PSeqStack st;
Elem stnode;
if( !root ) /*若空二叉树,则结束算法*/
{
printf("这是一棵空二叉树!\n");
return;
}
st=createEmptyStack_seq();
do /*进入以root指示的结点为根的子树*/
{
while(root) /*进入左子树*/
{
stnode.ptr=root;
stnode.tag=0;
push_seq(st,stnode);
root=root->llink;
}
stnode=top_seq(st); /*托出栈顶元素*/
pop_seq(st);
root=stnode.ptr;
while(stnode.tag==1) /*从右子树回来,访问root所指的结点*/
{
putchar(root->info);
putchar(' ');
if( isEmptyStack_seq(st) )
return; /*若栈空,则结束*/
else
{
stnode=top_seq(st);
pop_seq(st);
root=stnode.ptr;
}
}
stnode.tag=1; /*从左子树回来,准备进入右子树*/
push_seq(st,stnode);
root=root->rlink;
}while( !isEmptyStack_seq(st) );
}

PBinTreeNode createRest_BTree(void)
{
PBinTreeNode pbnode;
char ch;
ch=getchar();
if( ch=='@' ) pbnode=NULL;
else
{
pbnode=(PBinTreeNode)malloc(sizeof(struct BinTreeNode));
if( !pbnode )
{
printf("内存空间发生溢出!\n");
return pbnode;
}
pbnode->info=ch;
pbnode->llink=createRest_BTree();
pbnode->rlink=createRest_BTree();
}
return pbnode;
}

void main()
{
PBinTreeNode root;
printf("顺序地输入扩充二叉树的先根序列(外部结点“@”用表示):\n");
root=createRest_BTree();
printf("\n二叉树的后根序列为:\n");
postOrder(root);
printf("\n");
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...的电器到成都,请问一下,那个航空快一些呀,多少/公斤? 前女友和我分手一年之后,出车祸死了,我很高兴,这种心理是不是不... 为什么听到前女友去世的消息,我竟然放声大哭,她很爱我,是我对她腻了... 兰州银行充天然气必须要本行卡吗 从服饰礼仪看中西方文化差异 为什么iqoo11评价那么低? 相机快门线的运用范围 快门线是干什么用的 请问这是什么虫子 还挺硬的 在楼房内 整理箱上面发现的 屋内有木质上... 请问这是什么虫子?家里抓到,2cm左右。坐标北京,昌平,冬季12月,楼房... 奇瑞QQ61.1排量的到底有几种配置?2 急。急。急请问哪位懂车的人评估一下奇瑞Q6,1.1的排量,车... 怎样在word中把内容都放在一页?412 “safety”是什么意思?5 小黑屋码字软件可以在手机上用么78 挽四字词语8 视觉传达设计都学什么?以后一般都去什么岗位工作?38 国防生2生命见证彩虹,去哪买29 国防生2见证彩虹txt1 ...有霍家拳之铁臂娇娃22021年由 李萌萌主演的免费高清百度云资源... 我的小天地作文怎样写7 捡查院批捕了多久可以办取保候审 罗大佑的《你的样子》歌词是什么意思?256 故乡好词好句好段44 故乡.好词好句1 “故乡”好词好句5 故乡好词好句242 一年内怎么改第二次 ...书中的25课《世说新语》两则,《咏雪》和《陈太丘于友期》什么意思... 我要自己动手做纯手工焊接创意铁艺模型摆件 这样的话零部件可以... 二叉树的非递归遍历c语言代码2 程序员节有啥意义?会放假吗? 怎样让头发保湿148 让头发保湿的方法有哪些?9 头发干燥怎么保湿???16 ...键没坏 但是在守望先锋中侧键失效(已经设定了侧键近身攻击) 但是用... 怎样洗头可以让头发长久保湿 Y450 重装WIN7 64位系统,主板及芯片组,ITE C... 描写家乡的好词好句173 以“我的小天地”为题的作文6 ...公转的方向用箭头在图中适当的位置画出.(2)地球公转一周 有笔闲置资金,想要通过投资股票来增值养老,什么样的股票合适呢?_百度... 贵州省医保卡 门诊 07年的奇瑞Q61.3升手动豪华型这车怎么样好吗 1024程序员节的节日背景1 什么时候开始过年要拜年1 民间烧香什么情况下烧一柱香?什么情况下烧三柱香?什么情况下烧...149 apple bag face cat hat 之中与众不同的...17 去加拿大读2年diploma,毕业后拿三年工签。等工签时间到...28 自己在家做面条的方法1