王道书 P149 T8(求双分支节点个数)+ 拓展(求单分支节点个数和叶子节点个数)

/**
 * 用二叉树链式存储实现 王道 P149 T8(求双分支节点) + 拓展(求单分支节点和求叶子节点)
 *
 * ①算法思想
 * ①②③④全部使用递归方式,递归方式中最好用void,然后使用一个引用将结果带出去;
 * ①②③是比较通用的方法。
 * 对于①:求双分支节点
 * 对于②:求单分支节点
 * 对于③:求叶子节点
 * 对于④:求双分支节点
 *
 * ②算法设计
 */


#include <stdio.h>
#include <iostream>
#define MaxSize 100

typedef struct BiTreeNode{
    int data;
    BiTreeNode *lchild,*rchild;
}BiTreeNode,*BiTree;


//P149 T8
//①求双分支节点
//int count = 0;//可以这么写,但注意count要写在外面,函数里面不断地调用自身count不会一次一次置0;
//              //但一般还是会写个引用,如下所示。使用引用那么每次递归调用的时候向参数中传的就是自己,所以整个递归调用就是同一个。
void GetDoubleBranch_1(BiTree T,int &count){
    if(T != NULL){
        if(T -> lchild != NULL && T -> rchild != NULL)
            count++;
        GetDoubleBranch_1(T -> lchild,count);
        GetDoubleBranch_1(T -> rchild,count);
    }
}
//②求单分支节点
void GetSingleBranch(BiTree T,int &count){
    if(T != NULL){
        if(T -> lchild != NULL && T -> rchild == NULL || T -> lchild == NULL && T -> rchild != NULL)
            count++;
        GetSingleBranch(T -> lchild,count);
        GetSingleBranch(T -> rchild,count);
    }
}
//③求叶子节点
void GetLeafNode(BiTree T,int &count){
    if(T != NULL){
        if(T -> lchild == NULL && T -> rchild == NULL)
            count++;
        GetLeafNode(T -> lchild,count);
        GetLeafNode(T -> rchild,count);
    }
}
//④求双分支节点
int GetDoubleBranch_2(BiTree T){
    if(T == NULL){
        return 0;
    }
    else if(T -> lchild != NULL && T -> rchild != NULL){
        return 1 + GetDoubleBranch_2(T -> lchild) + GetDoubleBranch_2(T -> rchild);
    }else{//如果这个点只有一个分支,他的子树中可能还有双分支节点
        return GetDoubleBranch_2(T -> lchild) + GetDoubleBranch_2(T -> rchild);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值