二叉树中的各种递归

二叉树的链式结构很适合各种递归的实现🤔🤔🤔

下面是举例

目录

一、需要实现的递归函数接口

二、各函数接口的具体实现

三、函数的调试(运行举例)


一、需要实现的递归函数接口

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

创建的二叉树为

 

运行结果:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值