二叉树的定义-创建-遍历三步走

这是算法实验的一个小实验,自己实现了一遍,代码如下:

//main.cpp

#include <stdio.h>
#include <stdlib.h>
#include "create_binary_tree.h"
#include "hander_define.h"
#include "partition.h"
#include "quicksort.h"
int main()
{
 Tree* t[max];
// t=(_B_T *)malloc(sizeof(_B_T));
 Item data[]={3,5,6,4,1,2,10,9,11,8,7,12,'/0'};
 quicksort(data,0,11);
 init(t,data);
 create_binary_tree(t,0,11);
 printf_tree(t,11);
// all_traval(t[0],t[0]);
 return 0;
}

 

//create_binary_tree.h

//create_binary_tree.h
#define max 100
typedef int Item;
typedef struct _B_T{
 _B_T *left;
 _B_T *right;
 Item d;
}Tree;
void printf_tree(Tree* t[max],int length)
{
 int i=0;
 while(i<length){//init binary tree
  printf("ptrinfsa=%d l=%d r=%d/n",t[i]->d,t[i]->left->d,t[i]->right->d);
  i++;
 }
}

void init(Tree* t[max],Item *data)
{
 int i=0;
 while(data[i]!='/0'){
  t[i]=(_B_T *)malloc(sizeof(_B_T));
  t[i]->d=data[i];
  t[i]->left=NULL;
  t[i]->right=NULL;
  i++;
 }
}

Tree* create_binary_tree(Tree* t[max],int row,int high)
{
 int middle=(row+high)/2;
 if(high<=row) return t[row];
 if(t[middle]->left==NULL||t[middle]->right==NULL){
  t[middle]->left=create_binary_tree(t,row,middle);
  t[middle]->right=create_binary_tree(t,middle+1,high);
 }
 else{
  if(t[middle]->left!=NULL&&t[middle]->right!=NULL&&t[middle]->left->d==t[middle]->d){
   t[middle]->left=create_binary_tree(t,row,middle);
   t[middle]->right=create_binary_tree(t,middle+1,high);
   t[middle]->left=NULL;
  }
  else{
   t[middle]->left=create_binary_tree(t,row,middle);
   t[middle]->right=create_binary_tree(t,middle+1,high);
  }
 }
}
void all_traval(Tree* t,Tree* tt)
{
 if(t->right==NULL||t->left==NULL)return;
 printf("to left->%d/n",t->d);
 all_traval(t,t->left);
 printf("to right->%d/n",t->d);
 all_traval(t,t->right);
 return ;
}

 

//quicksort.h
void quicksort(Item *a,int low,int high)
{
 int i;
 if(high<=low) return;
 i=partition(a,low,high);
 quicksort(a,low,i-1);
 quicksort(a,i+1,high);
}

 

//partition.h
int partition(Item *a,int low,int high)
{
 int i,j;
 i=low;
 j=high-1;
 while(i<j){
  while(a[i]<a[high])i++;
  while(a[j]>a[high])j--;
  if(i>=j)break;
  exch(&a[i],&a[j]);
 }
 exch(&a[high],&a[i]);
 return i;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值