用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语言编写程序,创建一个二叉树的二叉链表结构,然后输出从根结点到所有叶子结点的路径。的主要内容,如果未能解决你的问题,请参考以下文章
数据结构 二叉树 用二叉链链表存储结构 写出删除二叉树所有的叶子节点的算法