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

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

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

#include 
#include 
#define MAXSIZE 10
#include 
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;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/607400.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-14
下一篇 2022-04-14

发表评论

登录后才能评论

评论列表(0条)

保存