- 算法思路
孩子兄弟表示法,即二叉树中,结点A的左指针代表A的孩子结点,A的右指针代表A的兄弟结点,当A为根结点时,则A的右指针表示另一棵树中的根结点,此时二叉树表示为森林。叶子结点的定义为:度为0的结点。我们要计算森林中的叶子结点个数,我们需先知道森林中的叶子结点对应于二叉树中结点具有什么特征。 - 寻找叶子结点
孩子兄弟表示的二叉树中,当结点左指针为空时,它一定是原森林中的叶子结点。注意:森林中某棵树仅有根结点,那么它也符合叶子结点的定义,也属于叶子结点。
代码如下:
typedef struct CsNode{
struct CsNode* firstchild;
struct CsNode* nextsibling;
int data;
}CsNode;
void CreateTree(CsNode* &node){
int data;
cout<<"please input data: "<<endl;
cin>>data;
if (data != -1) {
node = new CsNode();
node->data = data;
CreateTree(node->firstchild);
CreateTree(node->nextsibling);
}
}
void preOrder(CsNode* node){
if (node != NULL) {
cout<<node->data<<endl;
preOrder(node->firstchild);
preOrder(node->nextsibling);
}
}
int CountForestLeaves(CsNode* node){
if (node == NULL) {
return 0;
}
if (node->firstchild == NULL) {
return 1 + CountForestLeaves(node->nextsibling);
}else{
return CountForestLeaves(node->firstchild) + CountForestLeaves(node->nextsibling);
}
}
int main(int argc, const char * argv[]) {
CsNode* tree = new CsNode();
tree->firstchild = NULL;
tree->nextsibling = NULL;
CreateTree(tree);
preOrder(tree);
int leaves = CountForestLeaves(tree);
cout<<"leaves:"<<leaves<<endl;
return 0;
}