7-7 求二叉树的叶子结点个数(20 分)
以二叉链表作为二叉树的存储结构,求二叉树的叶子结点个数。
输入格式:
输入二叉树的先序序列。
提示:一棵二叉树的先序序列是一个字符串,若字符是‘#’,表示该二叉树是空树,否则该字符是相应结点的数据元素。
输出格式:
输出有两行:
第一行是二叉树的中序遍历序列;
第二行是二叉树的叶子结点个数。
输入样例:
ABC##DE#G##F###
输出样例:
CBEGDFA
3
思路:主要是不会建树,刚开始没想递归那块(还是递归用的不熟练)。
一开始想的思路是只要值不是null就一直往左叶子加,直到null出现,就该回去往最近一个节点的右叶子加,当时就想到这。。。。。看了谷老师代码,发现这不就是一个天然的递归吗?(走完下一层,返回上一层接着往下(另一条路)走。
当然不是知道用递归就可以做出来,还要知道怎么递归,其实是建树的递归,这里要对树有深刻理解,树的定义就是个递归,一个树包含了许多子树,这里就是以子树为单位建树,递归建树。
总结:递归类似于栈(个人感觉就递归就是栈,这道题完全可以用栈来做,不需要递归),凡事用到栈的思路就要想到可以用递归实现这条路。
#include<iostream>
#include<string>
using namespace std;
struct node{
node *l, *r;
char val;
};
int cnt = 0, leaf = 0;
string s;
node* createTree();
void levelshow(node *r);
void inshow(node *r);
int main(){
cin >> s;
node *root = createTree();
inshow(root);
cout << endl << leaf << endl;
return 0;
}
node* createTree(){
if(s[cnt] == '#'){
cnt++;
return NULL;
}
node *tmp = new node();
//tmp->l = NULL;
//tmp->r = NULL;
tmp->val = s[cnt++];
tmp->l = createTree();//把每个节点都当作一棵树来建立
tmp->r = createTree();
if(tmp->l == NULL && tmp->r == NULL)
leaf++;
return tmp;
}
void inshow(node *cur){//此处第一次访问开始
if(cur){
inshow(cur->l);
//初处第二次访问结束
cout << cur->val;
inshow(cur->r);
//此处第三次访问结束
}
}