二叉树的一些常用方法(求结点数,叶子数,深度,复制,打印)

下面介绍一下,二叉树的一些常用方法,结合前面写的二叉树的创建和遍历,那么二叉树的基本知识也就差不多了

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10
#include <string.h>
typedef struct BinaryTree
{
    char data;
    struct BinaryTree* lchild;
    struct BinaryTree* rchild;
}BT;

void Creat_Tree(BT** T)
{
    if((*T))
    {
        char input = 0;
        printf("请输入你想要存储的字符:>");
        scanf("%c",&input);
        getchar();
        if(input != 'Q')
        {
            *T = (BT*)malloc(sizeof(BT));//判断你的输出,如果不是Q,就创建一个结点来存储你的输出
            (*T)->data = input;//结点赋值
            Creat_Tree(&((*T)->lchild));//创建结点的左孩指针,并根据你的输出,判断是否创建左孩子结点
            Creat_Tree(&((*T)->rchild));//创建结点的右孩指针,并根据你的输出,判断是否创建右孩子结点
        }
        else
        {
            (*T) = NULL;//如果你输出Q,那么给当前结点赋空值,不再向下添加元素
        }
    }

}

int CountNode(BT* T)
{
    if(!T)
    {
        return 0;
    }
    else
        return CountNode(T->lchild) + CountNode(T->rchild) + 1;//二叉树的结点数等于它的左边结点数+右边结点数+自己

}

int CountLeaf(BT* T)
{
    if(!T)
    {
        return 0;
    }
    if(!T->lchild && !T->rchild)//左右孩子都为空,就是叶子结点
    {
        return 1;
    }
    return CountLeaf(T->lchild) + CountLeaf(T->rchild);//树左边的叶子结点+右边的叶子结点,就是整个树的叶子结点数

}

void CpyBinaryTree(BT** NewT, BT* T)//用二级指针接收 结点地址的地址
{
    if(T)
    {
        (*NewT) = (BT*)malloc(sizeof(BT));
        (*NewT)->data = T->data;
        CpyBinaryTree(&((*NewT)->lchild), T->lchild);
        CpyBinaryTree(&((*NewT)->rchild), T->rchild);
    }
    else
    {
        *NewT = NULL;
    }

}

void PrintBT(BT* NewT)
{
    if(NewT)
    {
        printf("%c ", NewT->data);
        PrintBT(NewT->lchild);
        PrintBT(NewT->rchild);
    }

}

int DepthBT(BT* NewT)
{
    int m, n;
    if(!NewT)
    {
        return 0;
    }
    else
    {
        m = DepthBT(NewT->lchild) + 1;//树的深度为 左边的深度和右边深度的较大者 + 1
        n = DepthBT(NewT->rchild) + 1;
    }
    if(m >= n)return m;
    else return n;
}

int main()
{
    BT* T;
    BT* NewT;
    Creat_Tree(&T);//创建二叉树
    CountNode(T);//计算二叉树总的结点数
    CountLeaf(T);//计算二叉树叶子结点数
    CpyBinaryTree(&NewT, T);//复制二叉树,因为要改变NewT,所以要取地址
    PrintBT(NewT);//打印二叉树
    DepthBT(NewT);//计算树的深度
    printf("深度为%d", DepthBT(NewT));



    return 0;
}

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值