问题及代码:
- /*
- * Copyright (c)2016,烟台大学计算机与控制工程学院
- * All rights reserved.
- * 文件名称:项目1.cpp
- * 作 者:泮春宇
- * 完成日期:2016年12月2日
- * 版 本 号:v1.0
- *问题描述:实现二叉树的二叉树构造算法的验证,并测试数据
- *输入描述:无
- *程序输出:测试数据
- */
头文件btree.h和源文件btree.cpp代码详见第十周项目1--二叉树算法库
主函数main.cpp代码:
1、由先序序列和中序序列构造二叉树
- #include <stdio.h>
- #include <malloc.h>
- #include "btree.h"
- BTNode *CreateBT1(char *pre,char *in,int n)
- /*pre存放先序序列,in存放中序序列,n为二叉树结点个数,
- 本算法执行后返回构造的二叉链的根结点指针*/
- {
- BTNode *s;
- char *p;
- int k;
- if (n<=0) return NULL;
- s=(BTNode *)malloc(sizeof(BTNode)); //创建二叉树结点*s
- s->data=*pre;
- for (p=in; p<in+n; p++) //在中序序列中找等于*ppos的位置k
- if (*p==*pre) //pre指向根结点
- break; //在in中找到后退出循环
- k=p-in; //确定根结点在in中的位置
- s->lchild=CreateBT1(pre+1,in,k); //递归构造左子树
- s->rchild=CreateBT1(pre+k+1,p+1,n-k-1); //递归构造右子树
- return s;
- }
- int main()
- {
- ElemType pre[]="ABDGCEF",in[]="DGBAECF";
- BTNode *b1;
- b1=CreateBT1(pre,in,7);
- printf("b1:");
- DispBTNode(b1);
- printf("\n");
- return 0;
- }
运算结果:
2、由中序序列和后序序列构造二叉树
- #include <stdio.h>
- #include <malloc.h>
- #include "btree.h"
- BTNode *CreateBT2(char *post,char *in,int n)
- /*post存放后序序列,in存放中序序列,n为二叉树结点个数,
- 本算法执行后返回构造的二叉链的根结点指针*/
- {
- BTNode *s;
- char r,*p;
- int k;
- if (n<=0) return NULL;
- r=*(post+n-1); //根结点值
- s=(BTNode *)malloc(sizeof(BTNode)); //创建二叉树结点*s
- s->data=r;
- for (p=in; p<in+n; p++) //在in中查找根结点
- if (*p==r)
- break;
- k=p-in; //k为根结点在in中的下标
- s->lchild=CreateBT2(post,in,k); //递归构造左子树
- s->rchild=CreateBT2(post+k,p+1,n-k-1); //递归构造右子树
- return s;
- }
- int main()
- {
- ElemType in[]="DGBAECF",post[]="GDBEFCA";
- BTNode *b2;
- b2=CreateBT2(post,in,7);
- printf("b2:");
- DispBTNode(b2);
- printf("\n");
- return 0;
- }
运算结果:
3、由顺序存储结构转成二叉树存储结构
- #include <stdio.h>
- #include <malloc.h>
- #include "btree.h"
- #define N 30
- typedef ElemType SqBTree[N];
- BTNode *trans(SqBTree a,int i)
- {
- BTNode *b;
- if (i>N)
- return(NULL);
- if (a[i]=='#')
- return(NULL); //当节点不存在时返回NULL
- b=(BTNode *)malloc(sizeof(BTNode)); //创建根节点
- b->data=a[i];
- b->lchild=trans(a,2*i); //递归创建左子树
- b->rchild=trans(a,2*i+1); //递归创建右子树
- return(b); //返回根节点
- }
- int main()
- {
- BTNode *b;
- ElemType s[]="0ABCD#EF#G####################";
- b=trans(s,1);
- printf("b:");
- DispBTNode(b);
- printf("\n");
- return 0;
- }
运算结果:
知识点总结:
二叉树构造算法的验证
学习心得:
由先序序列和后序序列不能构造二叉树