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

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


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

你可能感兴趣的:(王道书第五章综合应用题,算法,数据结构,c++,链表,c语言)