树的基本操作(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);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述