Uva 112-Tree Summing//建树,遍历

    这道题参考了大牛们的结题报告。很久没这样了。关键是这题很是坑人,输入有点困难。这道题不用建树,只需要判断叶子的位置就ok了。

    刚开始一直在纠结如何处理输入的问题,看了下大牛的代码,很简短,但是看的我云里雾里的,似懂非懂的。

    想到下午的观察发现,发现输入给的数字的顺序刚好是树的先序遍历。这样就可以往树的遍历上入手了。这里用c++的cin.clear()函数来处理输入的问题,在用递归来遍历树(刚开始还没看明白为什么说是递归)。

     简单的将二叉树画出来吧!

    

这样就看的很直观了吧!

 如果输入的是数字,就判断它是不是叶,从根结点开始递归。

 5是根节点,n=5,然后递归调用,然后是4,4不是结点,然后是11,11也不是,然后是7,7是,就这样一直到找到叶子结点为止。然后递归调用另一边,2是。

当然了这个递归结束的标志不明显。

下面是代码:

#include<iostream>
using namespace std;
bool ok;
bool tree_sum(int n,int sum)
{
    char ch;
    cin>>ch;
    int v;
    if(!((cin>>v)==0))
    {
        n+=v;
        bool t1=tree_sum(n,sum),t2=tree_sum(n,sum);//判断是不是叶子
        if(t1&&t2)
        {
            if(n==sum) ok=true;
        }
        cin>>ch;
        return false;
    }
    else//其实这里就是递归结束的标志
    {
        cin.clear();//这个函数用的好啊。反正我是想不到的。如果执行到这里,说明输入有问题是字符,那么就clear后继续输入。
        cin>>ch;
        return true;
    }
}
int main()
{
    int sum;
    while(!((cin>>sum)==0))
    {
        ok=false;
        tree_sum(0,sum);
        cout<<(ok?"yes":"no")<<endl;
    }
    return 0;
}

递归,理解的还不透彻啊!只会最简单的递归!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值