赞
踩
前序遍历创建树:
-
-
- bitree *creatbitree()//前序遍历的数值来创建树——递归
- {
- char ch;
- bitree *root;
- ch=getchar();//用于接收输入的数值
- if(ch=='*') return NULL;//用*来判断是否为空
- else{
- root=(bitree *)malloc(sizeof(bitree));
- root->data=ch;//赋值
- root->lchild=creatbitree();//左子树
- root->rchild=creatbitree();//右子树
- }
- return root;
- }
-
- [点击并拖拽以移动]
-
测量树的深度:
- int depthbitree(bitree *T)//测量树的深度
- {
- if(T==NULL) return 0;
- else{
- int leftheighter=depthbitree(T->lchild);
- int rightheighter=depthbitree(T->rchild);
- return (leftheighter > rightheighter?leftheighter+1:rightheighter+1);
- }
- }
计算树的叶子和总结点数 :
- int leaf_count(bitree *T)//测量叶子的数量
- {
- if(T==NULL) return 0;
- else if(!T->lchild&&!T->rchild)//如果左右结点都为空则他就是叶子结点
- return 1;
- else return leaf_count(T->lchild)+leaf_count(T->rchild);
- }
- int countbitree(bitree *T)//测量总的结点个数
- {
- if(T==NULL)
- return 0;
- else{
- return 1+countbitree(T->lchild)+countbitree(T->rchild);
- }
- }
前序、中序、后续遍历输出:
- int preorder(bitree *T)//前序遍历序列 (根左右)
- {
- if(T==NULL)
- return 0;
- else{
- printf("%c ",T->data);//先输出根节点
- preorder(T->lchild);
- preorder(T->rchild);
- }
- }
- int inorder(bitree *T)//中序遍历序列 (左根右)
- {
- if(T==NULL)
- return 0;
- else{
- inorder(T->lchild);//先输出左孩子
- printf("%c ",T->data);
- inorder(T->rchild);
- }
- }
- int postorder(bitree *T)//后序遍历序列 (左右根)
- {
- if(T==NULL)
- return 0;
- else{
- postorder(T->lchild);//先输出左孩子
- postorder(T->rchild);
- printf("%c ",T->data);
- }
- }
广义表形式输出:
- void displaybitree(bitree *T)//广义表输出
- {
- if (T == NULL) return;
- printf("%c", T->data);
- if (T->lchild == NULL && T->rchild == NULL)//判断是否是叶子节点
- return;
- printf("(");
- displaybitree(T->lchild);
- printf(",");
- displaybitree(T->rchild);
- printf(")");
- return;
- }
删除树
- bitree *Delete(bitree *T)//删除树
- {
- if(T->lchild)
- Delete(T->lchild);
- else if(T->rchild)
- Delete(T->rchild);
- else
- free(T);
- }
完整代码如下:
- #include"stdio.h"
- #include"stdlib.h"
- typedef int datatype;
- typedef struct innode
- {
- datatype data;
- struct innode *lchild,*rchild;
- }bitree;
- int i,j;
- bitree *creatbitree()//前序遍历的数值来创建树——递归
- {
- char ch;
- bitree *root;
- ch=getchar();//用于接收输入的数值
- if(ch=='*') return NULL;//用*来判断是否为空
- else{
- root=(bitree *)malloc(sizeof(bitree));
- root->data=ch;//赋值
- root->lchild=creatbitree();//左子树
- root->rchild=creatbitree();//右子树
- }
- return root;
- }
-
-
- int depthbitree(bitree *T)//测量树的深度
- {
- if(T==NULL) return 0;
- else{
- int leftheighter=depthbitree(T->lchild);
- int rightheighter=depthbitree(T->rchild);
- return (leftheighter > rightheighter?leftheighter+1:rightheighter+1);
- }
- }
- int leaf_count(bitree *T)//测量叶子的数量
- {
- if(T==NULL) return 0;
- else if(!T->lchild&&!T->rchild)//如果左右结点都为空则他就是叶子结点
- return 1;
- else return leaf_count(T->lchild)+leaf_count(T->rchild);
- }
- int countbitree(bitree *T)//测量总的结点个数
- {
- if(T==NULL)
- return 0;
- else{
- return 1+countbitree(T->lchild)+countbitree(T->rchild);
- }
- }
- bitree *copy(bitree *T)//复制树
- {
- if(T==NULL)
- return NULL;
- else{
- bitree *temp;
- temp=(bitree *)malloc(sizeof(bitree));
- temp->data=T->data;
- temp->lchild=copy(T->lchild);
- temp->rchild=copy(T->rchild);
- return temp;
- }
- }
- int preorder(bitree *T)//前序遍历序列 (根左右)
- {
- if(T==NULL)
- return 0;
- else{
- printf("%c ",T->data);//先输出根节点
- preorder(T->lchild);
- preorder(T->rchild);
- }
- }
- int inorder(bitree *T)//中序遍历序列 (左根右)
- {
- if(T==NULL)
- return 0;
- else{
- inorder(T->lchild);//先输出左孩子
- printf("%c ",T->data);
- inorder(T->rchild);
- }
- }
- int postorder(bitree *T)//后序遍历序列 (左右根)
- {
- if(T==NULL)
- return 0;
- else{
- postorder(T->lchild);//先输出左孩子
- postorder(T->rchild);
- printf("%c ",T->data);
- }
- }
- void displaybitree(bitree *T)//广义表输出
- {
- if (T == NULL) return;
- printf("%c", T->data);
- if (T->lchild == NULL && T->rchild == NULL)//判断是否是叶子节点
- return;
- printf("(");
- displaybitree(T->lchild);
- printf(",");
- displaybitree(T->rchild);
- printf(")");
- return;
- }
- bitree *Delete(bitree *T)//删除树
- {
- if(T->lchild)
- Delete(T->lchild);
- else if(T->rchild)
- Delete(T->rchild);
- else
- free(T);
- }
- main()
- {
- bitree *T;
- T=(bitree *)malloc(sizeof(bitree));
- T->lchild=NULL;
- T->rchild=NULL;
- puts("请输入树的前序遍历序列");
- T=creatbitree();
- int n=depthbitree(T);
- int m=leaf_count(T);
- int l=countbitree(T);
- puts("树创建完成");
- puts("前序输出为");
- printf("\t\t");
- preorder(T);
- puts("\n中序输出为");
- printf("\t\t");
- inorder(T);
- puts("\n后序输出为");
- printf("\t\t");
- postorder(T);
- puts("\n广义表输出");
- printf("\t\t");
- putchar('(');
- displaybitree(T);
- printf("\n高度%d\n叶子%d\n总结点%d\n",n,m,l);
- Delete(T);
- puts("删除成功");
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。