31行代码AC——PTA 求二叉树的叶子结点个数 (20分)——解题报告

励志用尽量少的代码做高效的表达。


以二叉链表作为二叉树的存储结构,求二叉树的叶子结点个数。

输入格式:

输入二叉树的先序序列。
提示:一棵二叉树的先序序列是一个字符串,若字符是‘#’,表示该二叉树是空树,否则该字符是相应结点的数据元素。

输出格式:

输出有两行:
第一行是二叉树的中序遍历序列;
第二行是二叉树的叶子结点个数。

输入样例:

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;
} 

择苦而安,择做而乐。虚拟现实远远比不上真实精彩之万一。

发布了97 篇原创文章 · 获赞 104 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43899069/article/details/104885319