二叉树的链式结构很适合各种递归的实现🤔🤔🤔
下面是举例
目录
一、需要实现的递归函数接口
#include <stdio.h>
#include <stdlib.h>
#define type int
typedef struct tree_node
{
type x;
struct tree_node* left;
struct tree_node* right;
}TN;
void preorder(TN* p);//前序遍历
void midorder(TN* p);//中序遍历
void postorder(TN* p);//后序遍历
int treeheight(TN * p);//求树的高度
int treesize(TN* p);//求树的结点数
int treeklevelsize(TN * p,int k);//第k层的结点个数
二、各函数接口的具体实现
1.一些工具函数的实现
int max(int a,int b)//取两数中的较大数
{
return a>b?a:b;
}
TN* buy_node(type x)//创建新结点
{
TN* new=(TN*)malloc(sizeof(TN));
if(new==NULL)
{
printf("创建新结点失败");
exit(-1);
}
new->left=NULL;
new->right=NULL;
new->x=x;
return new;
}
2.递归函数的实现
int treeklevelsize(TN * p,int k)//第k层的结点个数
{
if(p==NULL)
{
return 0;
}
if(k==1)
{
return 1;
}
return treeklevelsize(p->left, k-1)+treeklevelsize(p->right, k-1);
}
void preorder(TN* p)//前序遍历
{
if(p==NULL)
{
printf("NULL ");
return;
}
printf("%d ",p->x);
preorder(p->left);
preorder(p->right);
}
void midorder(TN* p)//中序遍历
{
if(p==NULL)
{
printf("NULL ");
return;
}
midorder(p->left);
printf("%d ",p->x);
midorder(p->right);
}
void postorder(TN* p)//后序遍历
{
if(p==NULL)
{
printf("NULL ");
return;
}
postorder(p->left);
postorder(p->right);
printf("%d ",p->x);
}
int treeheight(TN * p)//求树的高度
{
if(p==NULL)
{
return 0;
}
if(p->left==NULL&&p->right==NULL)
{
return 1;
}
return max(treeheight(p->left),treeheight(p->right))+1;
}
int treesize(TN* p)//求树的结点数
{
if(p==NULL)
{
return 0;
}
return treesize(p->left)+treesize(p->right)+1;
}
三、函数的调试(运行举例)
int main()
{
TN* a1=buy_node(1);
TN* a2=buy_node(2);
TN* a3=buy_node(3);
TN* a4=buy_node(4);
TN* a5=buy_node(5);
TN* a6=buy_node(6);
TN* a7=buy_node(7);
TN* a8=buy_node(8);
a1->left=a2;
a1->right=a4;
a2->left=a3;
a2->right=a7;
a7->left=a8;
a4->left=a5;
a4->right=a6;//自己创建和连接一个二叉树
printf("preorder:\n ");
preorder(a1);
printf("\n");
printf("midorder:\n ");
midorder(a1);
printf("\n");
printf("postorder:\n ");
postorder(a1);
printf("\n");
printf("treeheight=%d",treeheight(a1));
printf("\n");
printf("treeklevelsize=%d",treeklevelsize(a1,3));
printf("\n");
printf("treesize=%d",treesize(a1));
return 0;
}
创建的二叉树为:
运行结果: