用C语言编写程序,创建一个二叉树的二叉链表结构,然后输出从根结点到所有叶子结点的路径。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用C语言编写程序,创建一个二叉树的二叉链表结构,然后输出从根结点到所有叶子结点的路径。相关的知识,希望对你有一定的参考价值。

寻求完整的程序

#include
#include
#include
typedef
struct
node

char
data;
struct
node
*lchild;
struct
node
*rchild;
tnode;
tnode
*createtree()

tnode
*t;
char
ch;
ch=getchar();
if(ch=='0')
t=null;
else

t=(tnode
*)malloc(sizeof(tnode));
t->data=ch;
t->lchild=createtree();
t->rchild=createtree();

return
t;

void
listtree(tnode
*t)

if
(t!=null)

printf("%c",t->data);
if(t->lchild!=null||t->rchild!=null)

printf("(");
listtree(t->lchild);
if(t->rchild!=null)
printf(",");
listtree(t->rchild);
printf(")");



void
inorder(tnode
*t)

if(t!=null)

inorder(t->lchild);
printf("%c\t",t->data);
inorder(t->rchild);


void
leve(tnode
*t)

tnode
*quee[100];
int
front,rear;
front=-1;
rear=0;
quee[rear]=t;
while(front!=rear)

front++;
printf("%c\t",quee[front]->data);
if(quee[front]->lchild!=null)

rear++;
quee[rear]=quee[front]->lchild;

if(quee[front]->rchild!=null)

rear++;
quee[rear]=quee[front]->rchild;



main()

tnode
*t=null;
printf("请输入二叉树元素:");
t=createtree();
printf("广义表的输出:");
listtree(t);
printf("\n");
printf("二叉树的中序遍历:");
inorder(t);
printf("\n");
printf("二叉树的层次遍历:");
leve(t);
printf("\n");
system("pause");

/*
输入:ab00cd00e00f000
输出:a(b,c((d,e))
中序遍历:
b
a
d
c
e
层次遍历:a
b
c
d
e
*/
参考技术A #include <stdio.h>
#include <stdlib.h>
typedef struct BTnode

char data;
struct BTnode *lchild,*rchild;
BTNode;
#define NodeLen sizeof(BTNode)
BTNODE *Creat_Bt(void);
void Preorder(BTNode *bt);
void Inorder(BTNode *bt);
int count,deep;
main()

BTNode *t;
char s[10];
for(;;)

printf("1----------建立二叉树
2----------先中根遍历二叉树\n
3----------求叶子数和树深
4----------退出\n);
gets(s);
switch(*s)

case'1':t=Creat_Bt();break;
case'2':Preorder(t);printf("\n");break;
case'3':count=deep=0;
Leafs_deep(t,0);printf("\n叶子结点数:%d\n"count);printf("树深:%d\n",deep);break;
case'4':exit(0);

参考技术B typedef int DataType;
typedef struct BNode
DataType data;
struct BNode *left,*right;
* LinkTree;
#include <stdio.h>
#include <stdlib.h>
int LinkTreeCreate(LinkTree *T)

DataType d;

scanf("%d",&d);
if (d == 0)
*T = NULL;
else

if ((*T = (struct BNode*)malloc(sizeof(struct BNode))) == NULL)
return -1;
(*T)->data = d;
if (LinkTreeCreate(&(*T)->left) == -1)
return -1;
if (LinkTreeCreate(&(*T)->right) == -1)
return -1;

return 0;

struct PNode
struct BNode *ptr;
int flag;
;
typedef struct
struct PNode *bottom;
int stacksize;
int top;
SeqStack;
#define INCREMENT 10
int SeqStackPush(SeqStack *S,struct PNode d)

if (S->top == S->stacksize)

if ((S->bottom = (struct PNode*)realloc(S->bottom,(S->stacksize+INCREMENT)*sizeof(struct PNode))) == NULL)
return -1;
S->stacksize += INCREMENT;

S->bottom[S->top++] = d;
return 0;

int SeqStackPop(SeqStack *S,struct PNode *d)

if (S->top == 0)
return -1;
*d = S->bottom[--S->top];
return 0;

#define STACKSIZE 100
void LinkTreeTraverse(LinkTree T)

SeqStack S;
struct PNode p;

S.bottom = (struct PNode*)malloc(STACKSIZE*sizeof(struct PNode));
S.stacksize = STACKSIZE;
S.top = 0;
p.ptr = T;
p.flag = 0;
while (S.top >= 0)
if (p.ptr != NULL)

SeqStackPush(&S,p);
p.ptr = p.ptr->left;
p.flag = 0;

else

if (SeqStackPop(&S,&p) == -1)
break;
if (p.flag == 0)

p.flag = 1;
SeqStackPush(&S,p);
p.ptr = p.ptr->right;
p.flag = 1;

else

printf("%t",p.ptr->data);
p.ptr = NULL;



void main(void)

LinkTree T;

LinkTreeCreate(&T);
LinkTreeTraverse(T);

输入2 3 0 0 5 8 0 1 0 0 0
输出18532
参考技术C meng

建立二叉树的二叉链表表示,实现二叉树的先序、中序、后序和按层次遍历,统计并输出结点个数。

1)采用二叉链表存储结构建立二叉树,从键盘按先序输入二叉树的结点序列。如,建立如右图所示的二叉树,建立时按先序输入的结点序列为: abc###de#f##g##,其中“#”表示空格字符,用来代表空树。
(2)二叉树的建立、先序遍历、中序遍历、后序遍历均采用递归方式实现。
(3)层序遍历采用非递归方式实现。
(4)利用后序遍历算法统计结点个数。

以下是程序代码,里面还包括求树的深度和叶子,已经运行通过了。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define Max 20 //结点的最大个数
typedef struct node
char data;
struct node *lchild;
struct node *rchild;
BTNode; //自定义二叉树的结点类型
typedef BTNode *BTree; //定义二叉树的指针
int NodeNum,leaf; //NodeNUm为结点数,leaf为叶子数
BTree CreatBTree(void)
BTree T;
char ch;
if((ch=getchar())=='#')
return(NULL); //读入#,返回空指针
else
T=(BTNode *)malloc(sizeof(BTNode));//生成结点
T->data=ch;
T->lchild=CreatBTree();//构造左子树
T->rchild=CreatBTree();//构造右子树
return(T);


void Preorder(BTree T) //先序遍历

if(T)
printf("%c",T->data);//访问结点
Preorder(T->lchild);//先序遍历左子树
Preorder(T->rchild);//先序遍历右子树


void Inorder(BTree T)//中序遍历

if(T)

Inorder(T->lchild);//中序遍历左子树
printf("%c",T->data);//访问结点
Inorder(T->rchild);//中序遍历右字树


void Postorder(BTree T)//后序遍历

if(T)

Postorder(T->lchild);
Postorder(T->rchild);
printf("%c",T->data);


int TreeDepth(BTree T)//后序遍历求二叉树的深度,结点数和叶子数

int hl,hr,max;
if(T)

hl=TreeDepth(T->lchild);//求左深度
hr=TreeDepth(T->rchild);//求右深度
max=hl>hr?hl:hr;//取左右深度的最大值
NodeNum=NodeNum+1;//求结点数
if(hl==0&&hr==0)
leaf=leaf+1;
return(max+1);

else return(0);

void Levelorder(BTree T)//层次遍历二叉树

int front=0,rear=1;
BTNode *cq[Max],*p;//定义结点的指针数组cq
cq[1]=T;//根入队
while(front!=rear)

front=(front+1)%NodeNum;
p=cq[front];//出队
printf("%c",p->data);//出队,输出结点的值
if(p->lchild!=NULL)
rear=(rear+1)%NodeNum;
cq[rear]=p->rchild;//右子树入队



void main()

BTree root;
int i,depth;
printf("\n");
printf("创建二叉树,请输入完全二叉树的先序序列,用#代表虚结点:");
root=CreatBTree();//返回根结点
do
printf("********************SELECT********************\n");
printf("\t1:先序遍历\n");
printf("\t2:中序遍历\n");
printf("\t3:后序遍历\n");
printf("\t4:深度、结点数、叶子数\n");
printf("\t5:层次遍历\n");
printf("备注:选择层次遍历之前,需要先选择4,求出该树的结点数。");
printf("\t0:Exit\n");
printf("\t*********************************************\n");
scanf("%d",&i);//输入菜单序号
switch(i)

case 1:printf("先序遍历结果为:");
Preorder(root);
break;
case 2:printf("中序遍历结果为:");
Inorder(root);
break;
case 3:printf("后序遍历结果为:");
Postorder(root);
break;
case 4:depth=TreeDepth(root);
printf("深度=%d 结点数=%d",depth,NodeNum);
printf("叶子数=%d",leaf);
break;
case 5:printf("层次遍历为:");
Levelorder(root);
break;
default:exit(1);

printf("\n");

while(i!=0);
参考技术A typedef struct node

char data;
struct node *lchild,*rchild;
bitree;
bitree *root=NULL;
//创建树
bitree *CreateTree(char *sInPut)

bitree *root,*s;
bitree *Q[128];
int front,rear;
root=NULL;
front=1;
rear=0;
char temp[128],*p;
memset(temp,0,128);
strcpy(temp,sInPut);
p=temp;
while(strlen(p)>0)

s=NULL;
if(*p!='@')

s=(bitree*)malloc(sizeof(bitree));
s->data=*p;
s->lchild=NULL;
s->rchild=NULL;

rear++;
Q[rear]=s;
if(rear==1)

root=s;

else

if(s && Q[front])

if(rear%2==0)
Q[front]->lchild=s;
else
Q[front]->rchild=s;

if(rear%2==1) front++;

p+=2;

return root;

//释放树
void freetree(bitree *root)

if(root!=NULL)

freetree(root->lchild);
freetree(root->rchild);
free(root);


//前序遍历
void preorder(bitree *root)

if(root!=NULL)

printf("%c\t",root->data);
preorder(root->lchild,sOutPut);
preorder(root->rchild,sOutPut);


//中序遍历
void inorder(bitree *root)

if(root!=NULL)

inorder(root->lchild,sOutPut);
printf("%c\t",root->data);
inorder(root->rchild,sOutPut);


//后序遍历
void postorder(bitree *root)

if(root!=NULL)

postorder(root->lchild,sOutPut);
postorder(root->rchild,sOutPut);
printf("%c\t",root->data);


//层次遍历
void PrintTree(bitree *root)

CString sOutPut;
char temp[128];
bitree *Q[128],*s;
int front,rear;
front=0;
rear=0;
sOutPut.Empty();
Q[rear++]=root;
while(rear>front)

printf("%c\t",Q[front]->data);
sOutPut=temp;
s=Q[front++];
if(s->lchild!=NULL)
Q[rear++]=s->lchild;
if(s->rchild!=NULL)
Q[rear++]=s->rchild;


//树叶子数
void countleaf(bitree *root,int &count)
if(root!=NULL)
if((root->lchild==NULL)&&(root->rchild==NULL))
count++;
return;

countleaf(root->lchild,count);
countleaf(root->rchild,count);


//树深度
void treedepth(bitree *root,int l,int &h)
if(root!=NULL)
l=l+1;
if(l>h) h=l;
treedepth(root->lchild,l,h);
treedepth(root->rchild,l,h);

本回答被提问者采纳
参考技术B
总 叙2:油画框用定做的比较好,一般是木头框!绷上油画布(麻布)!(根据自己想画的大小可以任意做).然后刷三次乳白胶!一定要刷到位!待干后就可以画了!这些东西在美术用品店有售!大学附近也有售!
参考技术C
为感君王辗转思,遂教方士殷勤觅。 把自己的厚度给积累起来,

以上是关于用C语言编写程序,创建一个二叉树的二叉链表结构,然后输出从根结点到所有叶子结点的路径。的主要内容,如果未能解决你的问题,请参考以下文章

数据结构 二叉树 用二叉链链表存储结构 写出删除二叉树所有的叶子节点的算法

以二叉链表为存储结构,写出求二叉树高度和宽度的算法

二叉树与链表

C语言数据结构树和二叉树的问题

1、创建一棵二叉树,以二叉链表作存储结构,实现先根遍历算法 2、创建一棵二叉树,实现先根遍历算法、中根

如何在数据结构中,以二叉链表为存储结构,建立一棵二叉树,输出其先序,中序,后序遍历序列,统计其叶子