#include<stdio.h>
#include<math.h>
#define maxsize 20
typedef int ElemType;
typedef struct BiTree{
ElemType data[maxsize];
int nodenum;
}BiTree;
//顺序创建
void order_create_tree(BiTree *t){
int i,num;
t->nodenum=0;
printf("请输入你想创建几个元素\n");
scanf("%d",&num);
for(i=0;i<num;i++){
printf("请输入第%d个元素\n",i+1);
scanf("%d",&t->data[i]);
t->nodenum++;
}
}
//前序创建
void pre_create_tree(BiTree *t,int i){
int target;
scanf("%d",&target);
if(target == -1){
t->data[i]='\0';
}
else{
t->data[i]=target;
t->nodenum++;
//某个节点输入完毕后,紧接着输入它的左孩子和右孩子
printf("%d的左孩子节点:\n",target);
//递归调用
pre_create_tree(t,(i*2)+1);
printf("%d的右孩子节点:\n",target);
//递归调用
pre_create_tree(t,(i*2)+2);
}
}
//前序遍历
void for_tvs_tree(BiTree t,int n){
int num;
num = t.nodenum;
if (num == 0) {
printf("数组为空,无法遍历\n");
}else{
/*输出当前结点元素*/
printf("%d ",t.data[n]);
/*向左递归遍历*/
if ((n * 2 + 1) < num){
for_tvs_tree(t,n * 2 + 1);
}
/*向右递归遍历*/
if ((n * 2 + 2) < num){
for_tvs_tree(t,n * 2 + 2);
}
}
}
//中序遍历
void min_tvs_tree(BiTree t,int n){
int num;
num = t.nodenum;
if (num == 0) {
printf("数组为空,无法遍历\n");
}else{
/*向左递归遍历*/
if ((n * 2 + 1) < num){
min_tvs_tree(t,n * 2 + 1);
}
/*输出当前结点元素*/
printf("%d ",t.data[n]);
/*向右递归遍历*/
if ((n * 2 + 2) < num){
min_tvs_tree(t,n * 2 + 2);
}
}
}
//后序遍历
void aft_tvs_tree(BiTree t,int n){
int num;
num = t.nodenum;
if (num == 0) {
printf("数组为空,无法遍历\n");
}else{
/*向左递归遍历*/
if ((n * 2 + 1) < num){
aft_tvs_tree(t,n * 2 + 1);
}
/*向右递归遍历*/
if ((n * 2 + 2) < num){
aft_tvs_tree(t,n * 2 + 2);
}
/*输出当前结点元素*/
printf("%d ",t.data[n]);
}
}
//层序遍历
void layer_tvs_tree(BiTree t){
int num;
int i;
num = t.nodenum;
if (num == 0) {
printf("数组为空,无法遍历\n");
}else{
for(i=0;i<t.nodenum;i++){
printf("%d ",t.data[i]);
}
}
}
//根节点
void print_root(BiTree t){
int num;
int i=0;
num = t.nodenum;
if (num == 0) {
printf("数组为空\n");
}else{
printf("根节点是%d\n",t.data[i]);
}
}
//总结点个数
void print_sumnode(BiTree t){
printf("总结点个数为%d\n",t.nodenum);
}
//树的深度
void tree_depth(BiTree t){//计算二叉树的深度
int depth=0;
while((int)pow(2,depth)-1<t.nodenum){
depth++;
}
printf("该树的深度为%d\n",depth);
}
//主函数
int main(){
int n=0;
BiTree t;
t.nodenum=0;
printf("请输入你要创建的元素以-1结尾\n");
pre_create_tree(&t,n);
printf("前序遍历\n");
for_tvs_tree(t,n);
printf("\n");
printf("中序遍历\n");
min_tvs_tree(t,n);
printf("\n");
printf("后序遍历\n");
aft_tvs_tree(t,n);
printf("\n");
printf("层序遍历\n");
layer_tvs_tree(t);
printf("\n");
print_root(t);
print_sumnode(t);
tree_depth(t);
return 0;
}
二叉树的顺序存储
于 2022-11-03 13:28:40 首次发布