二叉树的建立和遍历(C)

建立以二叉链作为存储结构的二叉树,实现 1)先序遍历; 2)中序遍历; 3)后序遍历; 4)层序遍历; 5)编程计算二叉树的叶子结点个数。
Input
按照先序遍历序列输入二叉树中数据元素的值,没有的输入0表示。
Output
第一行输出先序遍历序列 第二行输出中序遍历序列 第三行输出后序遍历序列 第四行输出叶子结点的个数。

第1个回答  2012-12-12
请叫我雷锋

#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int value;
struct Node *left;
struct Node *right;
}Node;

Node *CreateTree() //建立二叉树,切记,左右子树为空也要输入0
{
int value;
Node *node;
scanf("%d",&value);
if(!value){
return NULL;
}
else
{
node=(Node*)malloc(sizeof(Node));
node->value=value;
node->left=CreateTree();
node->right=CreateTree();
}
return node;
}

void Preort(Node *node) //先序
{
printf("%d\t",node->value);
if(node->left!=NULL)Preort(node->left);
if(node->right!=NULL)Preort(node->right);
}

void Inorder(Node *node) //中序
{
if(node->left!=NULL)Preort(node->left);
printf("%d\t",node->value);
if(node->right!=NULL)Preort(node->right);
}

void Epilogue(Node *node) //后序
{
if(node->left!=NULL)Preort(node->left);
if(node->right!=NULL)Preort(node->right);
printf("%d\t",node->value);
}

int CaculateDepth(Node *node,int number) //计算叶子
{
if(node->left==NULL && node->right==NULL)return ++number;
if(node->left!=NULL)number=CaculateDepth(node->left,number);
if(node->right!=NULL)number=CaculateDepth(node->right,number);
return number;
}

void Print(Node *node,int flag)
{
if(node==NULL)printf("Have no elements\n");
else {
switch(flag)
{
case 1:
printf("\nPreorder traversal is :\n");
Preort(node);
break;
case 2:
printf("\nPreorder traversal is :\n");
Inorder(node);
break;
case 3:
printf("\nPreorder traversal is :\n");
Epilogue(node);
break;
case 4:
printf("\nLeaf Number is :\n%d\n",CaculateDepth(node,0));
break;
}
}
}

/*以下为层序遍历*/
typedef struct TreeQueueNode
{
Node *Data;
struct TreeQueueNode *next;
}QueueNode;

typedef struct _TreeQueue
{
struct TreeQueueNode *Head;
struct TreeQueueNode *Tail;
int NodeNumber;
}TreeQueue;

void InitQueue(TreeQueue *Queue,int size)
{
int i;
for(i=0;i<size;++i)
{
Queue[i].Head=NULL;
Queue[i].NodeNumber=0;
Queue[i].Tail=NULL;
}
}

void PushQueue(TreeQueue *Queue,Node *node)
{
if(Queue==NULL)return ;
else if(node == NULL)return;

if(Queue->NodeNumber==0)
{
Queue->Head=(QueueNode *)malloc(sizeof(QueueNode));
Queue->Head->Data=node;
Queue->Head->next=NULL;
Queue->Tail=Queue->Head;
Queue->NodeNumber++;
}
else
{
Queue->Tail->next=(QueueNode *)malloc(sizeof(QueueNode));
Queue->Tail->next->Data=node;
Queue->Tail->next->next=NULL;
Queue->Tail=Queue->Tail->next;
Queue->NodeNumber++;
}
}

int Travlleave(TreeQueue *Queue,Node *node , int leave)
{
static int LeaveNumber=0;
PushQueue(&Queue[leave],node);
if(leave>LeaveNumber)LeaveNumber=leave;
leave++;
if(node->left!=NULL)Travlleave(Queue,node->left,leave);
if(node->right!=NULL)Travlleave(Queue,node->right,leave);
leave--;
return LeaveNumber;
}

int TravlLeave(Node *node)
{
int leave=0,i;
TreeQueue Queue[100];
if(node!=NULL){
InitQueue(Queue,100);
leave=Travlleave(Queue,node ,0);
for(i=0;i<=leave;++i)
{
QueueNode *node=Queue[i].Head;
while(node!=NULL)
{
printf("%d\t",node->Data->value);
node=node->next;
}
printf("\n");
}
}
}追问

该怎么该啊这个

追答

哦 ,我忘了加main

追问

咋一运行就停止工作了?
我一菜鸟 不会改

第2个回答  2012-12-13

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

二叉树先序非递归遍历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语言)
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<<"后序:";...

...完成二叉树的建立,先序中序后序遍历的操作,求所有叶子结点总数_百度...
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 ...

是的,是已知前序遍历和中序遍历,建立二叉树具体应该怎么办呢
ECF是右子树。这样就先建立A,然后开始二分。以左右分别为一种情况,左子树先序是DB,中序是BD,所以B是D的左孩子,然后另一边也是一样,就可以得出C是A的右孩子,然后再以C二分。得出C的左孩子是E,右孩子是F,所以后续遍历就是DBEFCA.无论如何复杂的二叉树都是用这种方法、...

二叉树的遍历
(1)先序遍历 访问根;按先序遍历左子树;按先序遍历右子树 (2)中序遍历 按中序遍历左子树;访问根;按中序遍历右子树 (3)后序遍历 按后序遍历左子树;按后序遍历右子树;访问根例1.用顺序存储方式建立一棵有31个结点的满二叉树,并对其进行先序遍历。program erchashu1;var b:array[1..31] of char; e:...

二叉树的遍历
所谓遍历(Traversal)是指沿着某条搜索路线 依次对树中每个结点均做一次且仅做一次访问 访问结点所做的操作依赖于具体的应用问题 遍历是二叉树上最重要的运算之一 是二叉树上进行其它运算之基础 遍历方案 .遍历方案 从二叉树的递归定义可知 一棵非空的二叉树由根结点及左 右子树这三个基本部分组成 因此...

用VB编写 二叉树的建立与遍历、二叉树的排序
一、实验名称 二叉树的建立和遍历。二、实验目的 掌握二叉树的二叉链表存储结构及二叉树的建立方法。熟悉二叉树的遍历方法。三、实验内容 (1)根据先序遍历和中序遍历的序列,建立一棵二叉树(二叉树用二叉链表存储)。(2)分别以先序和中序遍历二叉树,将假设结果与给定的先序和中序遍历序列进行...

二叉树的先序遍历和中序遍历如下:先序遍历:EFHIGJK;中序遍历:HFIEJKG...
【答案】:C

相似回答