|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
typedef char bitreeElemType;
typedef struct BiNode //定义二叉链表
{
bitreeElemType data;
struct BiNode* lchild, * rchild;
}BiNode,*BiTree;
int leaf = 0;
BiTree creat(int n, char qian[], char zhong[]); //先序中序恢复二叉树
void pre_traverse_Bitree(BiTree T); //先序遍历
void in_traverse_Bitree(BiTree T); //中序遍历
void post_traverse_Bitree(BiTree T); //后序遍历
int Gethight_Bitree(BiTree T); //求高度
int Getleaf_Bitree(BiTree T); //求叶子数
BiTree creat(int n, char qian[], char zhong[])
{
int i;
BiTree root;
if (n == 0)
{
return NULL;
}
root = (BiTree)malloc(sizeof(BiNode));
root->data = qian[0];//根节点一定是先序排列的第一个
for (i = 0; i < n; i++)
{
if (zhong[i] == qian[0])//找到中序序列中与根节点相等的位置
{
break;
}
}
root->lchild = creat(i, qian + 1, zhong);//逐步遍历
root->rchild = creat(n - i - 1, qian + 1 + i, zhong + 1 + i);
return root;
}
void pre_traverse_Bitree(BiTree T)
{
if (!T)
return;
printf("%c", T->data);
pre_traverse_Bitree(T->lchild);
pre_traverse_Bitree(T->rchild);
}
void in_traverse_Bitree(BiTree T)
{
if (!T)
return;
in_traverse_Bitree(T->lchild);
printf("%c", T->data);
in_traverse_Bitree(T->rchild);
}
void post_traverse_Bitree(BiTree T)
{
if (!T)
return;
post_traverse_Bitree(T->lchild);
post_traverse_Bitree(T->rchild);
printf("%c", T->data);
}
int Gethight_Bitree(BiTree T)
{
if (!T)
return 0;
return Gethight_Bitree(T->lchild) > Gethight_Bitree(T->rchild) ? Gethight_Bitree(T->lchild) + 1
: Gethight_Bitree(T->rchild) + 1;
}
int Getleaf_Bitree(BiTree T)
{
if (!T)
return 0;
if (T->lchild == NULL && T->rchild == NULL)
return ++leaf;
Getleaf_Bitree(T->lchild);
Getleaf_Bitree(T->rchild);
}
int main()
{
int n;
printf("请输入节点数\n");
scanf("%d", &n);
char qian[100], zhong[100];
printf("请输入先序\n");
for(int i=0;i<n;i++)
{
scanf("%c",&qian[i]);
}
printf("请输入中序\n");
for(int i=0;i<n;i++)
{
scanf("%c",&zhong[i]);
}
BiTree T;
T = creat(n,qian,zhong);
printf("先序遍历为: \n");
pre_traverse_Bitree(T);
printf("该树高度为: %d\n", Gethight_Bitree(T));
printf("该树有%d个叶子\n", Getleaf_Bitree(T));
return 0;
}
先序中序恢复出来的二叉树怎么写才能成为其他函数的参数啊?我的运行结果到把中序敲上去就直接完了。问老师老师一点有用的都不说。求回复
程序是调试出来的,要调试程序的说
#include <stdio.h>
#include <stdlib.h>
typedef char bitreeElemType;
typedef struct BiNode //定义二叉链表
{
bitreeElemType data;
struct BiNode *lchild, *rchild;
} BiNode, *BiTree;
//int leaf = 0;
BiTree creat(int n, char qian[], char zhong[]); //先序中序恢复二叉树
void pre_traverse_Bitree(BiTree T); //先序遍历
void in_traverse_Bitree(BiTree T); //中序遍历
void post_traverse_Bitree(BiTree T); //后序遍历
int Gethight_Bitree(BiTree T); //求高度
int Getleaf_Bitree(BiTree T); //求叶子数
BiTree creat(int n, char qian[], char zhong[]) {
int i;
BiTree root;
if(n == 0) {
return NULL;
}
root = (BiTree)malloc(sizeof(BiNode));
root->data = qian[0]; //根节点一定是先序排列的第一个
for(i = 0; i < n; i++) {
if(zhong[i] == qian[0]) //找到中序序列中与根节点相等的位置
{
break;
}
}
root->lchild = creat(i, qian + 1, zhong); //逐步遍历
root->rchild = creat(n - i - 1, qian + 1 + i, zhong + 1 + i);
return root;
}
void pre_traverse_Bitree(BiTree T) {
if(!T)
return;
printf("%c", T->data);
pre_traverse_Bitree(T->lchild);
pre_traverse_Bitree(T->rchild);
}
void in_traverse_Bitree(BiTree T) {
if(!T)
return;
in_traverse_Bitree(T->lchild);
printf("%c", T->data);
in_traverse_Bitree(T->rchild);
}
void post_traverse_Bitree(BiTree T) {
if(!T)
return;
post_traverse_Bitree(T->lchild);
post_traverse_Bitree(T->rchild);
printf("%c", T->data);
}
int Gethight_Bitree(BiTree T) {
if(!T) return 0;
/*
return Gethight_Bitree(T->lchild) > Gethight_Bitree(T->rchild)
? Gethight_Bitree(T->lchild) + 1
: Gethight_Bitree(T->rchild) + 1;
*/
return (Gethight_Bitree(T->lchild) > Gethight_Bitree(T->rchild)
? Gethight_Bitree(T->lchild)
: Gethight_Bitree(T->rchild)) + 1;
}
/*
int Getleaf_Bitree(BiTree T) {
if(!T)
return 0;
if(T->lchild == NULL && T->rchild == NULL)
return ++leaf;
Getleaf_Bitree(T->lchild);
Getleaf_Bitree(T->rchild);
// return ???
}
*/
int Getleaf_Bitree(BiTree T) {
if(!T) return 0;
if(T->lchild == NULL && T->rchild == NULL) return 1;
return Getleaf_Bitree(T->lchild) + Getleaf_Bitree(T->rchild);
}
// 求你们了,释放一下内存吧
// 知道windows为什么连一个月也运行不了吗?
// 就是因为你们写程序,不释放内存
void tree_free(BiTree T) {
if(!T) return;
tree_free(T->lchild);
tree_free(T->rchild);
free(T);
}
int main() {
int n;
printf("请输入节点数\n");
scanf("%d", &n);
char qian[100], zhong[100];
printf("请输入先序\n");
// *************************
getchar(); // '\n'
// *************************
for(int i = 0; i < n; i++) {
scanf("%c", &qian[i]);
}
printf("请输入中序\n");
// *************************
getchar(); // '\n'
// *************************
for(int i = 0; i < n; i++) {
scanf("%c", &zhong[i]);
}
BiTree T;
T = creat(n, qian, zhong);
printf("先序遍历为: \n");
pre_traverse_Bitree(T);
printf("该树高度为: %d\n", Gethight_Bitree(T));
printf("该树有%d个叶子\n", Getleaf_Bitree(T));
tree_free(T);
return 0;
}
|
|