题目描述
普通树及其构成的森林均可转换成相应的二叉树,反之亦然。故而可以根据相应的转换方法去统计某一二叉树对应的森林中树的棵数。相应的二叉树可利用先序递归遍历算法创建。先序递归遍历建立二叉树的方法为:按照先序递归遍历的思想将对二叉树结点的抽象访问具体化为根据接收的数据决定是否产生该结点从而实现创建该二叉树的二叉链表存储结构。约定二叉树结点数据为单个大写英文字符。当接收的数据是字符"#"时表示该结点不需要创建,否则创建该结点。最后再统计该二叉树对应的森林中树的棵数。
输入
输入为接受键盘输入的由大写英文字符和"#"字符构成的一个字符串(用于创建对应的二叉树)
输出
输出该用例对应的二叉树表示的森林中树的棵数。
样例输入复制
A#B#CD###
样例输出复制
3
知识点1
递归算法:
void CreateTree(BTNode *&tree) { char ch; cin>>ch; tree=new BTNode;//或者 tree=(BTNode*)malloc(sizeof(BTNode)); if(ch=='#') tree=NULL; else { tree->data=ch; CreateTree(tree->lchild); CreateTree(tree->rchild); } }
知识点2:
普通树组成的森林转换为二叉树的过程示意图
从根结点开始,右结点的数目就是分离得到的树的棵数
void TreeCount(BTNode *tree,int &treeCount) { while(tree!=NULL) { treeCount++;//统计树的棵数 tree=tree->rchild;//遍历右结点 } }
完整代码:
#include<iostream> using namespace std; typedef struct BTNode { char data; BTNode *lchild,*rchild; }BTNode; void CreateTree(BTNode *&tree) { char ch; cin>>ch; tree=new BTNode; if(ch=='#') tree=NULL; else { tree->data=ch; CreateTree(tree->lchild); CreateTree(tree->rchild); } } void TreeCount(BTNode *tree,int &treeCount) { while(tree!=NULL) { treeCount++; tree=tree->rchild; } } void DestoryTree(BTNode *&tree) { if(tree!=NULL) { DestoryTree(tree->lchild); DestoryTree(tree->rchild); delete tree; } } int main() { BTNode *tree; CreateTree(tree); int treeCount=0; TreeCount(tree,treeCount); cout<<treeCount; return 0; }
Or
#include<iostream> using namespace std; typedef struct node { char bts; struct node *lchild,*rchild; }Tree; void CreateTree(Tree *&t) { char army; cin>>army; if(army=='#') t=NULL; else { t=new Tree; t->bts=army; CreateTree(t->lchild); CreateTree(t->rchild); } } int k=0; void CountT(Tree *&t) { if(t!=NULL) { k++; if(t->rchild!=NULL) CountT(t->rchild); } } int main() { Tree *t; CreateTree(t); CountT(t); cout<<k; return 0; }

浙公网安备 33010602011771号