Uva 112 Tree Summing 二叉树

本文详细介绍了如何通过读取输入数据并将其转换为二叉树,解决UVA在线裁判平台上的特定问题。重点在于理解如何区分括号输入与数值输入,并使用栈和深度优先搜索进行树的构建。

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

题目链接:[url]http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=48[/url]
主要思路:这道题目的难点在于如何把题目所给的输入数据转换成一棵树。首先定义一个字符型的变量c,再定义一个整型的变量num。因为开始一定是'(',所以先输入c(cin>>c;),然后判断,如果是'(',那么再输入num(cin>>num;),这里加一个判断,如果说cin>>num输入正常,那么输入的是一个数;如果说输入异常,那么输入的是')'。这样就可以把括号的输入和数字的输入分开了。然后就是入栈、出栈,转换成二叉树,然后再dfs。
具体代码:

#include<iostream>
#include<cstdlib>
#include<stack>
using namespace std;

struct Node
{
int value;
Node *left,*right;
};

int I;
bool dfs(Node *n,int sum)
{
sum+=n->value;
if(!n->left&&!n->right&&sum==I) return 1;
if(n->left&&dfs(n->left,sum)) return 1;
if(n->right&&dfs(n->right,sum)) return 1;
return 0;
}
int main()
{
//freopen("in.txt","r",stdin);
int num;
char c;
stack<Node *> s_Node;
while(cin>>I)
{
while(!s_Node.empty()) s_Node.pop();
int left_num=0,right_num=0;//左右括号的数目
do
{
cin>>c;
if(c=='(')
{
if(!(cin>>num))//如果输入异常,说明是')'
{
cin.clear();
cin>>c;
Node *tmp=NULL;
s_Node.push(tmp);
}
else
{
left_num++;
Node *tmp=(Node *)malloc(sizeof(Node));
tmp->value=num;
tmp->left=tmp->right=NULL;
s_Node.push(tmp);
}
}
else
{
right_num++;
Node *tmp,*left,*right;
right=s_Node.top();
s_Node.pop();
left=s_Node.top();
s_Node.pop();
tmp=s_Node.top();
tmp->left=left;
tmp->right=right;
}
}while(left_num>right_num);
Node *root=s_Node.top();
s_Node.pop();
if(root)
{
if(dfs(root,0))
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
else
cout<<"no"<<endl;
}
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值