二叉树的建立与遍历(C语言)

[问题描述] 建立一棵二叉树,并对其进行遍历(先序、中序、后序),打印输出遍历结果。
[基本要求] 从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立),并采用递归算法对其进行遍历(先序、中序、后序),将遍历结果打印输出。
[测试数据] ABCффDEфGффFффф(其中ф表示空格字符)
则输出结果为 先序:ABCDEGF 中序:CBEGDFA 后序:CGBFDBA

求编程源代码!!!!!!!!

楼主你好~~~“ф”字符的源代码我忘记了,我这里有一个自己写过的遍历算法
#include<iostream.h>
typedef struct btnode
{
char data;
struct btnode *Lchild,*Rchild;
}*bitreptr;

void Create(bitreptr &p)
{
char n;
p=new btnode;
cin>>n;
if(n!='#')
{
p->data=n;
Create(p->Lchild);
Create(p->Rchild);

}
else
p=NULL;

}

void preorder(bitreptr &p)
{
if(p)
{
cout<<p->data<<" ";
preorder(p->Lchild);
preorder(p->Rchild);
}
}

void midorder(bitreptr &p)
{
if(p)
{
midorder(p->Lchild);
cout<<p->data<<" ";
midorder(p->Rchild);
}
}

void postorder(bitreptr &p)
{
if(p)
{
postorder(p->Lchild);
postorder(p->Rchild);
cout<<p->data<<" ";
}
}

void change(bitreptr &p)
{
bitreptr t,q;
if(p)
{
t=p->Lchild;
q=p->Rchild;
p->Lchild=q;
p->Rchild=t;
change(p->Lchild);
change(p->Rchild);
}
}

void main()
{
char i;
cout<<"请选择所需功能('A'输出该二叉树序列,'B'输出交换后二叉树序列)"<<endl;
cin>>i;
bitreptr p;
cout<<"输入数据:";
Create(p);
switch(i)
{
case 'A':
{
cout<<"前序:";
preorder(p);
cout<<endl;
cout<<"中序:";
midorder(p);
cout<<endl;
cout<<"后序:";
postorder(p);
cout<<endl;
}break;
case 'B':
{
change(p);
cout<<"交换二叉树前序:";
preorder(p);
cout<<endl;
cout<<"交换二叉树中序:";
midorder(p);
cout<<endl;
cout<<"交换二叉树后序:";
postorder(p);
cout<<endl;
}break;
}

}

这个算法输入时要以“#”代表空节点,及将[测试数据] “ABCффDEфGффFффф”改成“ABC##DE#G##F###”即可。另外我的算法包括了二叉树左右子树交换的代码“change(bitreptr &p)”,只要楼主稍作修改就可以得到你想要的完美结果~
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-10-05
#include <stdio.h>//头文件
#include <stdlib.h>
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}
BiTNode,*BiTree;//定义结点类型
BiTree CreateBiTree()//创建树
{
char p;BiTree T;
scanf("%c",&p);
if(p==' ')
T=NULL;
else
{
T=(BiTNode *)malloc(sizeof(BiTNode));//为结点开辟空间
T->data=p;
T->lchild=CreateBiTree();
T->rchild=CreateBiTree();
}
return (T);
}
void PreOrder(BiTree T)//先序
{
if(T!=NULL)
{
printf("%c",T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);

}
}
void InOrder(BiTree T)//中序
{
if(T!=NULL)
{
InOrder(T->lchild);
printf("%c",T->data);
InOrder(T->rchild);

}
}
void PostOrder(BiTree T)//后序
{
if(T!=NULL)
{
PostOrder(T->lchild);
PostOrder(T->rchild);
printf("%c",T->data);
}
}
void main()//主函数
{
BiTree Ta;
Ta=CreateBiTree();
printf("先序遍历:");
printf("\n");
PreOrder(Ta);
printf("\n");
printf("中序遍历:");
printf("\n");
InOrder(Ta);
printf("\n");
printf("后序遍历:");
printf("\n");
PostOrder(Ta);
}本回答被提问者采纳
第2个回答  2020-12-18

第3个回答  2019-09-20
楼主你好~~~“ф”字符的源代码我忘记了,我这里有一个自己写过的遍历算法
#include
typedef
struct
btnode
{
char
data;
struct
btnode
*Lchild,*Rchild;
}*bitreptr;
void
Create(bitreptr
&p)
{
char
n;
p=new
btnode;
cin>>n;
if(n!='#')
{
p->data=n;
Create(p->Lchild);
Create(p->Rchild);
}
else
p=NULL;
}
void
preorder(bitreptr
&p)
{
if(p)
{
cout<
data<<"
";
preorder(p->Lchild);
preorder(p->Rchild);
}
}
void
midorder(bitreptr
&p)
{
if(p)
{
midorder(p->Lchild);
cout<
data<<"
";
midorder(p->Rchild);
}
}
void
postorder(bitreptr
&p)
{
if(p)
{
postorder(p->Lchild);
postorder(p->Rchild);
cout<
data<<"
";
}
}
void
change(bitreptr
&p)
{
bitreptr
t,q;
if(p)
{
t=p->Lchild;
q=p->Rchild;
p->Lchild=q;
p->Rchild=t;
change(p->Lchild);
change(p->Rchild);
}
}
void
main()
{
char
i;
cout<<"请选择所需功能('A'输出该二叉树序列,'B'输出交换后二叉树序列)"<
cin>>i;
bitreptr
p;
cout<<"输入数据:";
Create(p);
switch(i)
{
case
'A':
{
cout<<"前序:";
preorder(p);
cout<
cout<<"中序:";
midorder(p);
cout<
cout<<"后序:";
postorder(p);
cout<
}break;
case
'B':
{
change(p);
cout<<"交换二叉树前序:";
preorder(p);
cout<
cout<<"交换二叉树中序:";
midorder(p);
cout<
cout<<"交换二叉树后序:";
postorder(p);
cout<
}break;
}
}
这个算法输入时要以“#”代表空节点,及将[测试数据]
“ABCффDEфGффFффф”改成“ABC##DE#G##F###”即可。另外我的算法包括了二叉树左右子树交换的代码“change(bitreptr
&p)”,只要楼主稍作修改就可以得到你想要的完美结果~

二叉树先序非递归遍历C语言算法
\/*---递归---先序建立二叉树---*\/void CreateBiTree(bitree **T) { \/\/按先序次序输入二叉树中的结点的值(一个字符),空格字符表示空树, \/\/构造二叉链表表示二叉树 char ch; scanf("%c",&ch); if(ch=='#') *T=NULL; else{ *T=(bitree * )malloc(sizeof(bitree)); if(!*T) exit(1...

c语言 关于二叉树的创建和遍历(中序遍历)
CreateBiTree(BT,string);\/\/创建二叉树 printf("\\n中序遍历二叉树顺序为: ");inorder(BT);\/\/中序遍历二叉树 printf("\\n");}

...完成二叉树的建立,先序中序后序遍历的操作,求所有叶子结点总数_百度...
create(&Tree);printf("先序遍历:");print1(Tree);printf("中序遍历");print2(Tree);printf("后序遍历");print3(Tree);printf("\\n深 度:%d \\n",depth(Tree));printf("总结点数:%d \\n",Cnode(Tree));printf("叶子结点数:%d\\n",leaf);} ...

用C语言建立一棵二叉树,使用二杈链表存储,对其进行后续遍历,输出后序...
include<iostream.h> include<stdlib.h> define Maxsize 100 typedef int datatype;typedef struct node { datatype data;struct node* lchild;struct node* rchild;}BTNode;void CreatBTNode(BTNode *&b,char * str){ BTNode *p,*st[Maxsize];int top=-1;p=NULL;b=NULL;int j=0,k;char ...

c语言二叉树问题,勿写代码,求详细思考过程
中序遍历:若树不空,则先访问左子树,再访问根,再访问右子树。从后序遍历:CDABE得出E是最顶根节点。然后中序遍历:CADEB得出CAD是E的左子树中的,B是E的右子树中的。再分析后序遍历CDA可以知道A是CD的根,而中序是CAD得到C是A的左子树,D是A的右子树。(如下图)最后,先序遍历:若树...

二叉链表表示二叉树,复制一颗二叉树,如何用C语言算法设计,希望答案正确...
生成一个二叉树的结点(其数据域为item,左指针域为lptr,右指针域为rptr)BiTNode *GetTreeNode(TElemType item, BiTNode *lptr , BiTNode *rptr ){ if (!(T = (BiTNode*)malloc(sizeof(BiTNode))) exit(1); T-> data = item; T-> lchild = lptr; T-> rchild = rptr; return T;}BiTNode *...

二叉树的建立与遍历(C语言)
){ char i;cout<<"请选择所需功能('A'输出该二叉树序列,'B'输出交换后二叉树序列)"<<endl;cin>>i;bitreptr p;cout<<"输入数据:";Create(p);switch(i){ case 'A':{ cout<<"前序:";preorder(p);cout<<endl;cout<<"中序:";midorder(p);cout<<endl;cout<<"后序:";...

二叉树先序遍历算法流程图怎么画,学的是数据结构c语言。
首先要搞明白二叉树的几种遍历方法:(1)、先序遍历法:根左右;(2)、中序遍历法:左根右;(3)、后序遍历法:左右根。其中根:表示根节点;左:表示左子树;右:表示右子树。至于谈到如何画先序遍历的流程图,可以这样考虑:按照递归的算法进行遍历一棵二叉树。程序首先访问根节点,如果根节点...

求C语言编译程序:从键盘输入某一二叉树前序遍历及中序遍历序列,构造二 ...
输入树的节点,输入0结束 1 2 3 4 5 6 7 8 9 0 中序打印 1->2->3->4->5->6->7->8->9-> 后序打印 9->8->7->6->5->4->3->2->1-> 前序打印 1->2->3->4->5->6->7->8->9-> \/\/\/ include<stdlib.h> include<stdio.h> typedef struct tree { struct tr...

精通c语言的亲们,关于二叉树节点怎么计算呢
首先,你要使用到二叉树的遍历。二叉树的遍历有中序遍历,前序遍历和后续遍历。不管你用的是哪一中遍历方式,只要你扫描的某个节点的左右孩子为空,那么该节点就是叶子节点,这时你的计数器加1就行。如:f(binary_tree * head){ int count = 0;binary_tree pt = head;if(head == NULL) break...

相似回答