|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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;
- }
复制代码
|
|