#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define ElementType int
#define MaxSize 511 //the number of the node is 2^levels-1
//and the max level is 9
//An array to store each value of the node in the tree by its index
int values[MaxSize];
//node structure constructor
typedef struct bt {
ElementType data;
struct bt *lchild, *rchild;
} BinaryTreeNode,*BTRoot;
//function declear
ElementType InOrder(BTRoot root);
ElementType PreOrder(BTRoot root);
ElementType PostOrder(BTRoot root);
void listTree(int l);
void addSpace(int i);
//the main function to excute
main()
{
int i,l,n;
BTRoot r=malloc(sizeof(BinaryTreeNode));
printf("===================================================================\n");
printf("BinaryTree list & 3-order program by SongNan @ 2004\n");
printf("===================================================================\n");
printf("The following instructions can help you to use it:");
printf("\n");
printf("1.To tell how many level(s) you want to use:(1-9)");
printf("2.You should give the value to the current root(even a root of sub)\n");
printf("3.If you want to create the left child for the current node press Y\notherwise,N\n");
printf("4.Use the same way to create the right child for the current node\n");
printf("See the result if all the creation has been done\n");
printf("===================================================================\n");
printf("\n");
printf("How many levels of the tree you want to create?");
scanf("%d",&l);
n=pow(2,l)-1;
for(i=0;i<=n;i++)
{
values[i]=-1;
}
CreateTree(r,1);
printf("===================================================================\n");
printf("\nPreorder :");
PreOrder(r);
printf("\nInorder :");
InOrder(r);
printf("\nPostorder:");
PostOrder(r);
printf("\n");
printf("===================================================================\n");
printf("The constructor of the tree comes here:\n");
listTree(l);
printf("===================================================================\n");
printf("(ps:the value -1 means no such a node exist)\n");
printf("===================================================================\n");
printf("Copyright by SongNan @ 2004.11\n");
printf("All codes & program");
//for(i=0;i<31;i++)
//printf("%d\n",values[i]);
while(1) ;
return 0;
}
//inorder function
InOrder(BTRoot root)
{
if(!root) return 0;
InOrder(root->lchild);
printf("%4d",root->data);
InOrder(root->rchild);
}
//preorder function
PreOrder(BTRoot root)
{
if(!root) return 0;
printf("%4d",root->data);
PreOrder(root->lchild);
PreOrder(root->rchild);
}
//postorder function
PostOrder(BTRoot root)
{
if(!root) return 0;
PostOrder(root->lchild);
PostOrder(root->rchild);
printf("%4d",root->data);
}
/*receive the input data and create a node each time!*/
CreateTree(BTRoot root,int NodeNum) /* Preorder */
{
ElementType x;
int layer;
char c;
c='a';
layer=log(NodeNum)/log(2)+1;
printf("\nInput the root's value of the subtree %d:",NodeNum);
scanf("%d",&x);
root->data=x;
values[NodeNum]=x;
printf("Wanna create Leftchild for Node %d?(Y/N)",NodeNum);
scanf("%1s",&c);
if(c=='n'||c=='N') root->lchild=NULL;
else
{
root->lchild=(BTRoot)malloc(sizeof(BinaryTreeNode));
CreateTree(root->lchild,2*NodeNum);
}
printf("Wanna create Rightchild for Node %d?(Y/N)",NodeNum);
scanf("%1s",&c);
if(c=='n'||c=='N') root->rchild=NULL;
else
{
root->rchild=(BTRoot)malloc(sizeof(BinaryTreeNode));
CreateTree(root->rchild,2*NodeNum+1);
}
return 0;
}
//TO display the entire tree on the screen
void listTree(int Lv)
{
int lv,count,i=1;
for(lv=0;lv<Lv;lv++)
{
for(count=0;count<pow(2,lv);count++)
{
addSpace(pow(2,5-lv));
printf("%d",values[i]);
++i;
}
printf("\n");
}
}
void addSpace(int sn)
{
int i;
for(i=0;i<sn;i++)
printf(" ");
}