C语言二叉树
#include<stdio.h>
#include<malloc.h>
#define MAXNODE 50
#define MaxSize 50
typedef int ElemType;
typedef struct node
{
ElemType data;
struct node *lchild;
struct node *rchild;
}BTNode;
//初始化
void InitBTree(BTNode *&T)
{
T=NULL;
}
//创建二叉树
BTNode *CreateBTNode(char *str)
{ BTNode *St[MaxSize],*p=NULL,*T;
int top=-1,tag,j=0;
char ch;
T=NULL; /*建立的二叉树初始时为空*/
ch=str[j];
while (ch!='\0') /*str未扫描完时循环*/
{ switch(ch)
{
case '(':top++;St[top]=p;tag=1; break;
case ')':top--;break;
case ',':tag=2; break;
default:
p=(BTNode *)malloc(sizeof(BTNode));
p->data=ch;
p->lchild=p->rchild=NULL;
if (T==NULL) /*p为二叉树的根结点*/
T=p;
else /*已建立二叉树根结点*/
{ switch(tag)
{
case 1:St[top]->lchild=p;break;
case 2:St[top]->rchild=p;break;
}
}
}
j++;ch=str[j];
}
return T;
}
//查找结点
BTNode *FindNode(BTNode *T,ElemType x)
{ BTNode *p;
if (T==NULL)
return NULL;
else if (T->data==x)
return T;
else
{ p=FindNode(T->lchild,x);
if (p!=NULL)
return p;
else
return FindNode(T->rchild,x);
}
}
BTNode *LchildNode(BTNode *p)
{
return p->lchild;
}
BTNode *RchildNode(BTNode *p)
{
return p->rchild;
}
//求高度
int BTNodeDepth(BTNode *T)
{ int lchilddep,rchilddep;
if (T==NULL)
return(0); /*空树的高度为0*/
else
{
lchilddep=BTNodeDepth(T->lchild); /*求左子树的高度为lchilddep*/
rchilddep=BTNodeDepth(T->rchild); /*求右子树的高度为rchilddep*/
return(lchilddep>rchilddep)?(lchilddep+1):(rchilddep+1);
}
}
//访问二叉树结点
void visite (BTNode *T)
{
if(T==NULL)
printf("The node does not exist");
else
printf("%c",T->data);
}
//横向输出二叉树
void PrintBiTree(BTNode *T, int level) /*level设初始值为0*/
{
if(T!= NULL)
{
PrintBiTree(T->rchild, level+1);
if(level != 0) /*走过4*(level-1)个空格*/
{
for(int i=0; i <4*(level-1); i++)
{
printf("%s"," ");
}
printf("%s","---"); /*输出横线*/
}
visite(T); /*输出结点的数据元素值*/
printf("\n");
PrintBiTree(T->lchild,level+1);
}
}
//中序遍历
void InOrderTraverse(BTNode *T)
{ if (T!=NULL)
{ InOrderTraverse(T->lchild); /*递归访问左子树*/
visite(T); /*访问根结点*/
InOrderTraverse(T->rchild); /*递归访问右子树*/
}
}
//层次遍历
void LevelTraverse(BTNode *T)
{ BTNode *p;
BTNode *qu[MaxSize]; /*定义环形队列,存放结点指针*/
int front,rear; /*定义队头和队尾指针*/
front=rear=-1; /*置队列为空队列*/
rear++;
qu[rear]=T; /*根结点指针进入队列*/
while (front!=rear) /*队列不为空*/
{ front=(front+1)%MaxSize;
p=qu[front]; /*队头出队列*/
visite(p); /*访问结点*/
if (p->lchild!=NULL) /*有左孩子时将其进队*/
{
rear=(rear+1)%MaxSize;
qu[rear]=p->lchild;
}
if (p->rchild!=NULL) /*有右孩子时将其进队*/
{ rear=(rear+1)%MaxSize;
qu[rear]=p->rchild;
}
}
}
void printfBT(BTNode *T)
{
if(T!=NULL)
{
printf("%c",T->data);
if(T->lchild!=NULL||T->rchild!=NULL)
{
printf("(");
if(T->rchild=NULL)
{
printf(",");
}
{
printfBT(T->rchild);
printf(")");
}
}
}
}


...全文
相关推荐
C语言实现二叉树的创建、插入、删除、遍历等操作
本篇将详细介绍如何用C语言实现二叉树的创建、插入、删除以及各种遍历方法,并探讨度为0、1、2的节点统计,以及排序二叉树的实现。1.
【数据结构】C语言实现二叉树
【数据结构】第五章——树与二叉树 详细介绍如何通过C语言实现一棵二叉树……
二叉树的层次遍历用C语言二叉树的层次遍历用C语言
根据给定的信息,本文将详细解释如何使用C语言实现二叉树的层次遍历,并对提供的部分代码进行解析。### 二叉树的层次遍历#### 什么是二叉树的层次遍历?
C语言二叉树的三种遍历
"本资源提供了一个C语言实现的二叉树遍历程序,包括前序(Pre-order)、中序(In-order)和后序(Post-order)遍历方法。通过`CreateBiTree`函数创建二叉树,输入字符作
二叉树C语言
在C语言中,实际应用二叉树时,还需要注意内存管理,确保在不再需要节点时释放其占用的内存,防止内存泄漏。


