/**
* 用二叉树链式存储实现 王道 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);
}
}
王道书 P149 T8(求双分支节点个数)+ 拓展(求单分支节点个数和叶子节点个数)
于 2022-08-30 14:50:58 首次发布