励志用尽量少的代码做高效的表达。
以二叉链表作为二叉树的存储结构,求二叉树的叶子结点个数。
输入格式:
输入二叉树的先序序列。
提示:一棵二叉树的先序序列是一个字符串,若字符是‘#’,表示该二叉树是空树,否则该字符是相应结点的数据元素。
输出格式:
输出有两行:
第一行是二叉树的中序遍历序列;
第二行是二叉树的叶子结点个数。
输入样例:
ABC##DE#G##F###
输出样例:
CBEGDFA
3
分析:
由于本题较基础,因此思路从解题转为优化。
本题考查树的中序遍历+求叶子节点个数。
值得注意的是:一般的思维是:中序遍历建一个函数,求叶子结点建一个函数。但更优化的解法是:将两个函数合一,可以减少一次树的遍历,提高效率。
代码:(去掉3行注释为31行)
#include<bits/stdc++.h>
using namespace std;
int sum = 0;
//1、声明
typedef struct BiTNode {
char x;
struct BiTNode* l, *r;
}*BiTree;
//2、创建树
BiTree Create(BiTree T) {
char ch = getchar(); //赋值
if(ch == '#') T = NULL; //遇#则置空
else {
T = new BiTNode();
T->x = ch; //赋值
T->l = Create(T->l); //递归赋值
T->r = Create(T->r);
} return T;
}
//3、中序遍历+求叶子
void Mid(BiTree T) {
if(T) {
if(T->l == NULL && T->r == NULL) sum++;
if(T->l) Mid(T->l); //中序遍历就是把输出放在中间。
cout << T->x;
if(T->r) Mid(T->r);
}
}
int main() {
BiTree T;
T = Create(T);
Mid(T); cout << endl << sum;
return 0;
}