普通的二叉树和完全二叉树的创建方法

#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int value;
struct  node *left_child;
struct  node *right_child;
}BinaryTree;


#define bj 0


//*****************Create_funcation_1*****************

此方法是最基础的方法  这种方法 要求二叉树的数据足够的少

BinaryTree* create_1(){
BinaryTree *p=NULL;
p=(BinaryTree*)malloc(sizeof(BinaryTree));
p->value=1;

p->left_child=(BinaryTree*)malloc(sizeof(BinaryTree));
p->left_child->value=2;

p->left_child->left_child=(BinaryTree*)malloc(sizeof(BinaryTree));
p->left_child->left_child->value=4;
p->left_child->left_child->left_child=NULL;
p->left_child->left_child->right_child=NULL;


p->left_child->right_child=(BinaryTree*)malloc(sizeof(BinaryTree));
p->left_child->right_child->value=5;
p->left_child->right_child->left_child=NULL;
p->left_child->right_child->right_child=NULL;
    
    p->right_child=(BinaryTree*)malloc(sizeof(BinaryTree));
p->right_child->value=5;

p->right_child->left_child=(BinaryTree*)malloc(sizeof(BinaryTree));
p->right_child->left_child->value=6;
p->right_child->left_child->left_child=NULL;
p->right_child->left_child->right_child=NULL;

p->right_child->right_child=NULL;

return p;
}


//****************************create_funcation_2****************************8

二叉树的先序创建  (递归实现)

void create_2(BinaryTree **p){
int date;
scanf("%d",&date);
if(date==bj)  return;
*p=(BinaryTree*)malloc(sizeof(BinaryTree));
(*p)->value=date;
(*p)->left_child=NULL;
(*p)->right_child=NULL;
create_2(&(*p)->left_child);
create_2(&(*p)->right_child);
}


//****************************create_funcation_3*******************************8

完全二叉树的实现(传入数组以及数组的长度 )  数组元素的先后就是每一层的数据的先后书序(从上到下 从左到右)

BinaryTree* create_3(int a[],int length){
BinaryTree *p=(BinaryTree*)malloc(sizeof(BinaryTree)*length);
for(int i=0;i<length;i++){
p[i].value=a[i];
p[i].left_child=NULL;
p[i].right_child=NULL;
}
for(int i=0;i<=length/2-1;i++){
if(2*i+1<length){
p[i].left_child=&p[2*i+1];
}
if(2*i+2<length){
p[i].right_child=&p[2*i+2];
}
}
return p;
}

二叉树的先序遍历
void PreTraver(BinaryTree *p){
if(p==NULL)  return ;
printf("%d ",p->value);
PreTraver(p->left_child);
PreTraver(p->right_child);
}

二叉树的中序遍历
void PmTraver(BinaryTree *p){
if(p==NULL)  return ;
PmTraver(p->left_child);
printf("%d ",p->value);
PmTraver(p->right_child);
}

二叉树的后序遍历
void PhTraver(BinaryTree *p){
if(p==NULL)  return ;
PhTraver(p->left_child);
PhTraver(p->right_child);
printf("%d ",p->value);
}

int main(){
BinaryTree *p_1=NULL;
p_1=create_1();
printf("*************************************\n");
PreTraver(p_1);
printf("\n***********************************\n");
PmTraver(p_1);
printf("\n***********************************\n");
PhTraver(p_1);
printf("\n******************************************************\n");

BinaryTree *p_2=NULL;
create_2(&p_2);
printf("*************************************\n");
PreTraver(p_2);
printf("\n***********************************\n");
PmTraver(p_2);
printf("\n***********************************\n");
PhTraver(p_2);
printf("\n*******************************************************\n");

BinaryTree *p_3=NULL;
int a[]={1,2,3,4,5,6};
p_3=create_3(a,sizeof(a)/sizeof(a[0]));
printf("\n***********************************\n");
PreTraver(p_3);
printf("\n***********************************\n");
PmTraver(p_3);
printf("\n***********************************\n");
PhTraver(p_3);
printf("\n*******************************************************\n");
return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42211587/article/details/80889280