求二叉树的叶子结点个数(前序建立二叉树)

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);
        //此处第三次访问结束
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值