树的基本操作(C语言)

 

代码
#include <cstdio>
#include
<cstdlib>
#include
<queue>
#include
<algorithm>
using namespace std;

typedef
struct _btree
{
int data;
struct _btree *left;
struct _btree *right;
}btree,
*ptree;

ptree BuildTree(
int data[]);
void PrintTree(ptree ptr);
void CountLeaf(ptree ptr,int &count);
void leaveorderoutput(ptree ptr);
int depth(ptree ptr);
void countElem(ptree ptr,int &elem);
ptree copyTree(ptree ptr);
void DeleteTree(ptree ptr);

int main(void)
{
int array[10];
int count=0;
int countelem=0;
for(int i=0;i<10;i++)
{
array[i]
=rand()%10;
}

for(int i=0;i<10;i++)
{
printf(
"%d ",array[i]);
}
printf(
"\n");
ptree root
=BuildTree(array);

PrintTree(root);
printf(
"\n");

CountLeaf(root,count);
printf(
"CountLeaf:%d\n",count);

leaveorderoutput(root);
printf(
"\n");
int depthval=depth(root);
printf(
"depth:%d\n",depthval);
countElem(root,countelem);
printf(
"count elem:%d\n",countelem);

ptree root2
=copyTree(root);
PrintTree(root2);
printf(
"\n");

DeleteTree(root);
DeleteTree(root2);
}

ptree BuildTree(
int data[])
{
ptree root
=NULL;
int i=0;
root
=(ptree)malloc(sizeof(btree));
root
->data=data[i++];
root
->left=NULL;
root
->right=NULL;
ptree ptr
=root,pre;
while(i!=10)
{
ptr
=root;
while(ptr != NULL)
{
pre
=ptr;
if(data[i]>ptr->data)
{
ptr
=ptr->left;
}
else
{
ptr
=ptr->right;
}
}

ptr
=(ptree)malloc(sizeof(btree));
ptr
->data=data[i++];
ptr
->left=NULL;
ptr
->right=NULL;

if(ptr->data > pre->data)
{
pre
->left=ptr;
}
else
{
pre
->right=ptr;
}
}

return root;
}

void PrintTree(ptree ptr)
{
if(ptr != NULL)
{
PrintTree(ptr
->left);
printf(
"%d ",ptr->data);
//PrintTree(ptr->left);
PrintTree(ptr->right);
}
}

void CountLeaf(ptree ptr,int &count)
{
if(ptr != NULL)
{
if(ptr->left == NULL && ptr->right == NULL)
{
++count;
}
CountLeaf(ptr
->left,count);
CountLeaf(ptr
->right,count);
}
}

void leaveorderoutput(ptree ptr) // 显示每层元素
{
queue
<ptree> q;
ptree p;

q.push(ptr);

while(!q.empty())
{
p
=q.front();
q.pop();
printf(
"%d ",p->data);
if(p->left != NULL)
{
q.push(p
->left);
}
if(p->right != NULL)
{
q.push(p
->right);
}
}
}

int depth(ptree ptr)
{
int depthLeft,depthRight,depthval;

if(ptr == NULL)
{
depthval
=-1;
}
else
{
depthLeft
=depth(ptr->left);
depthRight
=depth(ptr->right);
depthval
=1+(depthLeft>depthRight ? depthLeft:depthRight);
}
return depthval;
}

void countElem(ptree ptr,int &elem)
{
if(ptr != NULL)
{
++elem;
countElem(ptr
->left,elem);
countElem(ptr
->right,elem);
}
}

ptree copyTree(ptree ptr)
{
ptree newLeft,newRight,newNode;
if(ptr==NULL)
{
return NULL;
}

newLeft
=copyTree(ptr->left);
newRight
=copyTree(ptr->right);
newNode
=(ptree)malloc(sizeof(btree));
newNode
->data=ptr->data;
newNode
->left=newLeft;
newNode
->right=newRight;
return newNode;
}

void DeleteTree(ptree ptr)
{
if(ptr != NULL)
{
DeleteTree(ptr
->left);
DeleteTree(ptr
->right);
free(ptr);
}
}

 

 

posted @ 2010-10-23 13:48  linyilong  阅读(573)  评论(0编辑  收藏  举报