二叉樹的定義-創建-遍歷三步走

這是算法實驗的一個小實驗,自己實現了一遍,代碼如下:

//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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章