早教吧 育儿知识 作业答案 考试题库 百科 知识分享

利用栈的基本操作写出先序遍历的非递归形式的算法。

题目详情
利用栈的基本操作写出先序遍历的非递归形式的算法。
▼优质解答
答案和解析
我有现成的做好了的程序,调试成功。这个程序的难点就在于这种很别扭的输入形式,所以我为它设计了一个结构体形式存放输入内容,再将它转化成了线性结构。
#include
#include

struct inform /*建立输入信息结构体inform*/
{ char data;

int l;

int r;

int signl; /*作为标记的signl,signr*/
int signr;
};
struct leafnode /*建立叶子节点结构体*/
{
char leaf;

leafnode* lchild;

leafnode* rchild;
};
void print(inform* ps, int n);
void judge ( inform* ps );
leafnode* creatree(); /*声明二叉树的建立函数*/
void preorder (leafnode* T); /*声明先序遍历函数*/
void inorder (leafnode* T); /*声明中序遍历函数*/
void postorder (leafnode* T); /*声明后序遍历函数*/
char a[100];
int k=1;
int s=0;
inform *p;
void main()
{
/*-------------------------------按格式输入信息-----------------------------------*/

int n;

cout<<"请输入二叉树内容:第一行为节点总数n ,后面的n行是节点的具体形式:"<
cout<<"n= ";

cin>>n;

p=(inform* )malloc( n*sizeof(inform) ); /*开辟的一个叶子结构体型的指针数组*/
inform *p1; p1=p;
for(int i=0; i
{
cin>>(p+i)->data>>(p+i)->l>>(p+i)->r;
if((p+i)->l != -1) (p+i)->signl=1; /*用signl signr 的0,1标示输入的信息中是否有左或右孩子*/
else (p+i)->signl= 0;
if((p+i)->r !=-1) (p+i)->signr=1;
else (p+i)->signr= 0;
}
/*--------------------------------------------------------------------------------------------*/
a[0]= p->data;
judge ( p1 ); /*用递归算法将输入数据信息转为线性字符串*/

cout< cout</*------------------------------------------遍历-----------------------------------*/
leafnode* T;
T= creatree();
/*先续遍历二叉树*/
cout<<"先序遍历二叉树: "< preorder( T );
cout< inorder ( T );
cout< postorder( T );
cout<}

/*------------------------------------------函数定义-------------------------------*/
void judge( inform* ps ) /*用函数的递归来将输入的信息转化为线性的数组*/
{
inform* b;
if (ps->signl==0)
{
a[k]='@';
k++;
}
else
{
b = p+(ps->l);
a[k] = b->data;
k++;
judge(b);
}

if ((ps->signr) == 0)
{
a[k]='@';
k++;
}
else
{
b = p+(ps->r );
a[k] = b->data;
k++;
judge(b);
}

}

leafnode* creatree() /*建立二叉树函数*/
{
char ch;

leafnode *t;

ch= a[s];
s++;

if(ch=='@')
{
t=NULL;
}
else
{
t=(leafnode* )malloc(sizeof(leafnode));
t->leaf=ch;
t->lchild=creatree();
t->rchild=creatree();
}
return t;
}
/*先序遍历的递归函数*/
void preorder (leafnode* T)
{
if(T)
{
cout<leaf;
preorder(T->lchild);
preorder(T->rchild);
}
}
/*中序遍历的递归函数*/
void inorder (leafnode* T)
{
if(T)
{
inorder(T->lchild);
cout<leaf;
inorder(T->rchild);
}
}
/*后序遍历的递归函数*/
void postorder (leafnode* T)
{
if(T)
{
postorder(T->lchild);
postorder(T->rchild);
cout<leaf;
}
}
看了 利用栈的基本操作写出先序遍历...的网友还看了以下:

秦腔是我国历史上最悠久的剧种之一,其最早可以追溯到3000年前的先秦时期,是我国“梆子戏的鼻祖”。  2020-05-13 …

下列表述不正确的是A不管形式任务如何变化,党的先进性具体内涵是始终不变的B一个政党过去先进不等于现  2020-05-16 …

在一棵二叉树的先序遍历、中序遍历、后序遍历所产生的序列中,所有叶节点的先后顺序A.都不相同B.完  2020-05-23 …

在二叉树节点的先序遍历、中序遍历以及后序遍历中,所有叶子节点的先后顺序都是 ______的。  2020-05-23 …

二叉树的先序遍历和中序遍历如下:先序遍历:EFHIGJK中序遍历:HFIEJKG该二叉树根的右子树的  2020-05-24 …

在一棵二叉树的先序遍历、中序遍历、后序遍历所产生的序列中,所有叶节点的先后顺序()。A.都不相同B.  2020-05-24 …

在一棵二叉树的先序遍历、中序遍历、后序遍历所产生的序列中,所有叶结点的先后顺序A.都不相同B.完  2020-05-24 …

对一棵二叉树的先序遍历、后序遍历和中序遍历所产生的序列中,所有叶结点的先后顺序是 ()。A.各不相  2020-05-24 …

A.由其后序遍历序列和中序遍历序列可以构造该二叉树的先序遍历序列B.由其先序遍历序列和后序  2020-05-26 …

关于森林的遍历有以下说法:①森林的先序遍历等同于其对应的二叉树的先序遍历。②森林的中序遍历等同  2020-05-26 …