数据结构二叉树存储代码.txt
#include <stdio.h>
#include <stdlib.h>
/*二叉树的链式存储表示*/
typedef char DataType;  /*应由用户定义DataType的实际类型*/
typedef struct node
{ DataType data;
struct node *lchild, *rchild; /*左右孩子指针*/
} BinTNode;    /*结点类型*/
typedef BinTNode *BinTree;
void main()
{ void ListBinTree(BinTree T); /*用广义表表示二叉树*/
void DisplayBinTree(BinTree T); /*用凹入表表示二叉树*/
void CreateBinTree(BinTree *T); /*构造二叉链表*/
void Preorder(BinTree T);  /*前序遍历二叉树*/
void Inorder(BinTree T);  /*中序遍历二叉树*/
void Postorder(BinTree T);  /*后序遍历二叉树*/
int nodes(BinTree T);  /*计算总结点数*/
int leafs(BinTree T);  /*计算总叶子数*/
BinTree swap(BinTree T);  /*交换左右子树*/
BinTree T;
printf("请输入先序序列(虚结点用空格表示):\n");
CreateBinTree(&T);
ListBinTree(T);
printf("\n");
DisplayBinTree(T);
printf("前序遍历:\n");
Preorder(T);
printf("\n");
printf("中序遍历:\n");
Inorder(T);
printf("\n");
printf("后序遍历:\n");
Postorder(T);
printf("\n");
printf("二叉树的总结点数为%d\n",nodes(T));
printf("二叉树的总叶子结点数为%d\n",leafs(T));
T=swap(T);
ListBinTree(T);
printf("\n");
}
/*构造二叉链表*/
void CreateBinTree(BinTree *T)
{ char ch;
if ((ch=getchar())==' ')
*T=NULL;
else
{ /*读入非空格*/
*T=(BinTNode *)malloc(sizeof(BinTNode));/*生成结点*/
(*T)->data=ch;
CreateBinTree(&(*T)->lchild );  /*构造左子树*/
二叉树定义
CreateBinTree(&(*T)->rchild );  /*构造右子树*/
}
}
/*用广义表表示二叉树*/
void ListBinTree(BinTree T)
{ if (T!=NULL)
{ printf("%c",T->data);
if (T->lchild!=NULL||T->rchild!=NULL)
{ printf("(");
ListBinTree(T->lchild);
if (T->rchild!=NULL)
printf(",");
ListBinTree(T->rchild);
printf(")");
}
}
}
/*用凹入表表示二叉树*/
void DisplayBinTree(BinTree T)
{BinTree stack[100],p;
int level[100],top,n,i;
if (T!=NULL)
{ printf("用凹入表表示二叉树:\n");
top=1;
stack[top]=T;
level[top]=3;
while(top>0)
{ p=stack[top];
n=level[top];
for (i=1;i<=n; i++)
printf(" ");
printf("%c\n",p->data);
top--;
if (p->rchild!=NULL)
{ top++;
stack[top]=p->rchild;
level[top]=n+3;
}
if (p->lchild!=NULL)
{ top++;
stack[top]=p->lchild;
level[top]=n+3;
}
}
}
}
/*前序遍历二叉树*/
void Preorder(BinTree T)
{ if(T)
{ printf("%c",T->data); /*访问结点*/
Preorder(T->lchild);
Preorder(T->rchild);
}
}
/*中序遍历二叉树*/
void Inorder(BinTree T)
{if(T)
{Inorder(T->lchild);
printf("%C",T->data);
Inorder(T->rchild);
}
}
/*后序遍历二叉树*/
void Postorder(BinTree T)
{if(T)
{
Postorder(T->lchild);
Postorder(T->rchild);
printf("%C",T->data);
}
}
/*计算总结点
数*/
int nodes(BinTree T)
{ if(T)
{if( (T->lchild==NULL)&&(T->rchild==NULL))
return 1;
else
return nodes(T->lchild)+nodes(T->rchild)+1;
}return 0;
}
/
*计算总叶子数*/
int leafs(BinTree T)
{ if(T)
{ if ((T->lchild==NULL)&&(T->rchild==NULL))
return 1;
else
return leafs(T->lchild)+leafs(T->rchild);
} return 0;
}
/*交换左右子树*/
BinTree swap(BinTree T)
{  BinTree p;
if(T)
{ if((T->lchild)||(T->rchild))
{ p=T->lchild;
T->lchild=T->rchild;
T->rchild=p;
}swap(T->lchild);
swap(T->rchild);
}
return T;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。