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

本文介绍了一种通过递归实现二叉树遍历的方法,特别关注于如何处理输入并判断叶子节点的位置。文章详细解释了利用C++中的cin.clear()处理输入问题,并通过递归遍历来寻找叶子节点的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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



内容概要:本文档主要展示了C语言中关于字符串处理、指针操作以及动态内存分配的相关代码示例。首先介绍了如何实现键值对(“key=value”)字符串的解析,包括去除多余空格和根据键获取对应值的功能,并提供了相应的测试用例。接着演示了从给定字符串中分离出奇偶位置字符的方法,并将结果分别存储到两个不同的缓冲区中。此外,还探讨了常量(const)修饰符在变量和指针中的应用规则,解释了不同类型指针的区别及其使用场景。最后,详细讲解了如何动态分配二维字符数组,并实现了对这类数组的排序与释放操作。 适合人群:具有C语言基础的程序员或计算机科学相关专业的学生,尤其是那些希望深入理解字符串处理、指针操作以及动态内存管理机制的学习者。 使用场景及目标:①掌握如何高效地解析键值对字符串并去除其中的空白字符;②学会编写能够正确处理奇偶索引字符的函数;③理解const修饰符的作用范围及其对程序逻辑的影响;④熟悉动态分配二维字符数组的技术,并能对其进行有效的排序和清理。 阅读建议:由于本资源涉及较多底层概念和技术细节,建议读者先复习C语言基础知识,特别是指针和内存管理部分。在学习过程中,可以尝试动手编写类似的代码片段,以便更好地理解和掌握文中所介绍的各种技巧。同时,注意观察代码注释,它们对于理解复杂逻辑非常有帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值