二叉树的基本操作(求层数,求节点数,求度为0结点个数,复制二叉树)

前言:这几个操作本质还是递归,所以理解递归尤为重要!

一、求层数

int GetLayerNum(BiTree root)
{
    if(root==NULL)
    {
        return 0;
    }
    int left=GetLayerNum(root->left);
    int right=GetLayerNum(root->right);
    if(left>right)
    {
        return left+1;
    }else{
        return right+1;
    }
}

二、求解点数

int GetBiTreeNodeNum(BiTree root)
{
    if(root==NULL)
    {
        return 0;
    }else{
        return GetBiTreeNodeNum(root->left)+GetBiTreeNodeNum(root->right)+1;
    }
}

三、求度为0的节点个数

int GetDegreeIsZeroNodeNum(BiTree root)
{
    if(root==NULL)
    {
        return 0;
    }else if(root->left==NULL && root->right==NULL){
        return 1;
    }else{
        return GetDegreeIsZeroNodeNum(root->left)+GetDegreeIsZeroNodeNum(root->right);
    }
}

四:复制二叉树

可以先来看下这个代码,这个代码是可以运行的,但是拷贝之后没有任何结果,当传进实参时(root2传进来为空值),函数形成形参指向root2.root2=(BiTree)malloc(sizeof(BiNode));,这句话,相当是修改了形参的地址,而不是修改此指针指向的值。所以函数执行完root2还是空。

void CopyBiTree(BiTree root1,BiTree root2)
{
    if(root1==NULL)
    {
        root2=NULL;
    }else{
        root2=(BiTree)malloc(sizeof(BiNode));
        root2->data=root1->data;
        CopyBiTree(root1->left,root2->left);
        CopyBiTree(root1->right,root2->right);
    }
}

提供两种方法。

void CopyBiTree(BiTree root1,BiTree *root2)
{
    if(root1==NULL)
    {
        *root2=NULL;
    }else{
        *root2=(BiTree)malloc(sizeof(BiNode));
        (*root2)->data=root1->data;
        CopyBiTree(root1->left,&((*root2)->left));
        CopyBiTree(root1->right,&((*root2)->right));
    }
}
BiTree CopyBiTree2(BiTree root1)
{
    BiTree root2;
    if(root1==NULL)
    {
        root2=NULL;
    }else{
        root2=(BiTree)malloc(sizeof(BiNode));
        root2->data=root1->data;
        root2->left=CopyBiTree2(root1->left);
        root2->right=CopyBiTree2(root1->right);
    }
    return root2;
}

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值