建立任意二叉树的二叉链表存储,并对其进行先序、中序、后序遍历。

2022-08-19 09:52

C语言。。。采用二叉链表作为存储结构,以加入虚结点的先序序列输入该二叉树,并设置选单,依据选单项分别输出该二叉树的先序、中序、后序序列。二叉树子结点的数据域可采用字符类型。
3个回答
#include "stdio.h"
#include "stdlib.h"
#define STACK_INIT_SIZE 10 //栈的初始长度
#define STACKINCREMENT 5 //栈的追加长度

typedef struct bitree{
char data;
struct bitree *lchild,*rchild;
}bitree; //二叉树结点定义

typedef struct {
bitree **base;
bitree **top;
int stacksize;
}sqstack; // 链栈结点定义top栈顶 base栈底 且栈元素是指向二叉树结点的二级指针
//建立一个空栈
int initstack(sqstack *s)
{s->base=(bitree *)malloc(STACK_INIT_SIZE*sizeof(bitree)); //栈底指向开辟空间
if(!s->base) exit(1); //抛出异常
s->top=s->base; //栈顶=栈尾 表示栈空
s->stacksize=STACK_INIT_SIZE; //栈长度为开辟空间大小
return 1;
}
//进栈
int push(sqstack *s,bitree *e)
{if(s->top-s->base>=s->stacksize) //如果栈满 追加开辟空间
{s->base=(bitree *)realloc (s->base,(s->stacksize+STACKINCREMENT)* sizeof(bitree));
if(!s->base) exit(1); //抛出异常
s->top=s->base+s->stacksize; //感觉这一句没用
s->stacksize+=STACKINCREMENT;}
*(s->top)=e;s->top++; //进栈 栈顶后移
return 1;
}
//出栈
int pop(sqstack *s,bitree **e)
{if(s->top==s->base) return 0; //栈空 返回0
--s->top;*e=*(s->top); //栈顶前移 取出栈顶元素给e
return 1;}
//取栈顶
int gettop(sqstack *s,bitree **e) //去栈顶元素 注意top指向的是栈顶的后一个
{if(s->top==s->base) return 0; //所以 s->top-1
*e=*(s->top-1);
return 1;
}
/*------------------------非递归-----先序建立二叉树----------------------------------*/
bitree *createprebitree()
{char ch;bitree *ht,*p,*q;
sqstack *s;
s=malloc(sizeof(bitree)); //加上这一句为s 初始化开辟空间
ch=getchar();
if(ch!='#'&&ch!='\n') /* 输入二叉树先序顺序 是以完全二叉树的先序顺序
不是完全二叉树的把没有的结点以#表示 */
{ht=(bitree *)malloc(sizeof(bitree));
ht->data=ch;
ht->lchild=ht->rchild=NULL;
p=ht;
initstack(s);
push(s,ht); //根节点进栈
while((ch=getchar())!='\n') // 算
{if(ch!='#') {q=(bitree *)malloc(sizeof(bitree)); // 法
q->data=ch; //
if(p==*(s->top-1)) p->lchild=q; // 核
else p->rchild=q; //
push(s,q);p=q; // 心
} //
else {if(p==*(s->top-1)) p->lchild=NULL; // 的
else p->rchild=NULL; //
pop(s,&p);} // 步
//
} // 骤
return ht;
}
else return NULL;
}
/*--------------------------递归---------先序建立二叉树-------------------------------*/
void CreateBiTree(bitree **T) {
//按先序次序输入二叉树中的结点的值(一个字符),空格字符表示空树,
//构造二叉链表表示二叉树
char ch;
scanf("%c",&ch);
if(ch=='#') *T=NULL;
else{
*T=(bitree * )malloc(sizeof(bitree));
if(!*T) exit(1);
(*T)->data=ch; //生成根结点
CreateBiTree(&(*T)->lchild); //构造左子树
CreateBiTree(&(*T)->rchild); //构造右子树
}
}
/*--------------------------非递归-------中序建立二叉树-------------------------------*/
/*--------------------------递归---------中序建立二叉树-------------------------------*/
/*--------------------------非递归-------后序建立二叉树-------------------------------*/
/*--------------------------递归---------后序建立二叉树-------------------------------*/

/*-----------------------非递归------先序输出二叉树------------------------------*/
void preordertraverse(bitree *h)
{sqstack m;
initstack(&m);
while(h||m_base!=m_top)
{if(h) {push(&m,h);printf("%c",h->data);h=h->lchild;}
else{pop(&m,&h);
h=h->rchild;}
}
}
/*------------------------非递归-----中序输出二叉树----------------------------*/
void inordertraverse(bitree *h)
{sqstack m;
initstack(&m);
while(h||m_base!=m_top)
{if(h) {push(&m,h);h=h->lchild;}
else {
pop(&m,&h);
printf("%c",h->data);
h=h->rchild;
}
}
}
/*---------------------非递归----后序遍历二叉树----------------------------------*/
void postordertraverse(bitree *h)
{
sqstack m;
initstack(&m);
while(h||m_base!=m_top)
{if(h) {
push(&m,h);
h=h->lchild;}
else {
bitree *r; //使用r结点表示访问了右子树 代替标志域
gettop(&m,&h);
if(h->rchild&&h->rchild!=r)
{h=h->rchild;
push(&m,h);
h=h->lchild;}
else{pop(&m,&h);
printf("%c",h->data);
r=h;h=NULL;}
}
}
}
//层次遍历二叉树 用队列 哈哈以后做
/*-------------------------------主过程-------------------------------*/
int main()
{bitree *ht;
printf("先序非递归建立一个二叉树:");
if((ht=createprebitree())!=NULL) //非递归建立
//CreateBiTree(&ht);
//if(ht!=NULL) //递归建立
{
printf("先序遍历输出二叉树:");
preordertraverse(ht);
putchar('\n');
printf("中序遍历输出二叉树:");
inordertraverse(ht);
putchar('\n');
printf("后序遍历输出二叉树:");
postordertraverse(ht);
putchar('\n');
}
else printf("空二叉树\n");
}
这是先序递归和非递归建立二叉树 和 先、中、后 的遍历输出
建立任意二叉树的二叉链表存储,并对其进行先序、中序、后序遍历。
财源滚滚随春到 喜气洋洋伴福来 横批:财源广进 淘你喜欢,淘你所爱,快购吧
二叉树的定义是递归的。用递归就可以实现了。
建立二叉树,前,中,后遍历:
bitree_node* creat_bitree(bitree_node *r)
{
ch=getchar();
if(ch=='#') return NULL;
else
{
r=new bitree_node;
r->data=ch;
r->lchild=creat_bitree(r->lchild);
r->rchild=creat_bitree(r->rchild);
}
return r;
}
void preorder(bitree_node *r)
{
bitree_node* p=r;
if(p==NULL) return;
else
{
cout<data;
preorder(p->lchild);
preorder(p->rchild);
}

}
void inorder(bitree_node *r)
{
bitree_node* p=r;
if(p==NULL) return;
else
{
inorder(p->lchild);
cout<data;
inorder(p->rchild);
}
}
void postorder(bitree_node *r)
{
bitree_node* p=r;
if(p==NULL) return;
else
{
postorder(p->lchild);
postorder(p->rchild);
cout<data;
}
}
相关问答
用二叉链表作为存储结构,建立二叉树,对二叉树进行前序、中序、后序遍历,在对建立的二叉树进行中序线索
1个回答2022-09-30 07:34
typedef struct{ int item; *BiTree left; *BiTree right; }BiTree; 以上是二叉树的定义。 前序: a_view(BiTre...
全文
写出二叉树的先序遍历、中序遍历、后序遍历。
3个回答2022-09-30 19:30
首先 观察这个二叉树 可见是这样的:1.以B为根节点的左子树 A根节点 以C为根节点的右子树 2.以D为根节点的左子树 B根节点 以E为根节点的右子树 3.以G为根节点的左子树 D根节点 以H为根...
全文
什么叫二叉树前序遍历,中序遍历,后序遍历?
1个回答2022-08-13 07:52
二叉树的这三种遍历方法,是按照每颗子树的根节点顺序遍历的。 前序遍历就是先遍历根节点,然后遍历左节点,最后是右节点; 中序遍历就是先遍历左节点,然后遍历中间的根节点,最后是右节点; 后序遍历就是先遍历...
全文
二叉树的先序、中序和后序序列 请构造出该二叉树
1个回答2023-03-04 21:40
先序的第一个为二叉树树根A,因此后序的最后一个也是A 回到中序,以A为根划分,左子树有4个结点,右子树有5个结点 现在看后序:前4个最后的是B,因此先序的第二个是B,并且中序的第二个也是B 简化如下:...
全文
建立二叉树的二叉链表表示,实现二叉树的先序、中序、后序和按层次遍历,统计并输出结点个数。
1个回答2022-10-01 02:17
为感君王辗转思,遂教方士殷勤觅。 把自己的厚度给积累起来,
二叉树中,什么是前序,中序。后序!
1个回答2022-09-23 20:15
是三种遍历方法,前序:先根结点后左孩子最后右孩子 中序:先左孩子后根结点最后右孩子 后序:先左孩子后右孩子最后根结点
已知二叉树的前序遍历和中序遍历,怎样得到它的后序
1个回答2023-01-30 02:00
已知二叉树的前序遍历和中序遍历就可以知道二叉树的形状,然后即可得到它的后序序列。(方法一) 已知二叉树的前序遍历和中序遍历 步骤一:从前序遍历序列中找到根结点(首结点) 步骤二:然后从中序序列...
全文
已知二叉树的先序序列,怎么建立二叉树并求其叶子结点和深度?~
1个回答2022-12-14 09:45
谭浩忠的书比较好、。易懂。
任何一颗二叉树的叶子结点在先序、中序、后序遍历序列中的相对次序是什么?
3个回答2022-09-18 20:57
任何一颗二叉树的叶子结点在先序、中序、后序遍历序列中的相对次序是什么,应该是按每一个程序的先后排列吧,不过具体的怎么排列我这边也不太了解,不过哪个叶子还是什么程序,都是按先后排列的。
在二叉树中,已经知道前序遍历和中序遍历,怎么求后序遍历
2个回答2023-02-12 01:00
从前序的第一个结点开始确定根,中序决定左子树和右子树,如第一个结点a,根据中序可知,a的左子树是dbe,右子树是fc,再从前序中确定第二个根b,根据中序可知b的左子树是d,右子树为e,依次重复执行,直...
全文
扫码下载APP
听书听课听播客,随时随地陪伴你
热门问答