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