本文共 2164 字,大约阅读时间需要 7 分钟。
题目链接: https://vjudge.net/problem/UVA-122
题目描述: 给你一种二叉树的构造方法, 让你逐层输出二叉树的节点值, 如果不能够则输出"not complete"
解题思路: 这道题就是硬搞就可以了, 参考紫书去做的, 首先处理输入就是非常麻烦的事情, 用到了sscanf就会轻松很多, 看来C中还是有很多很多的好用的标准库函数可以拿来用的, 例如还有本题中的strchr() , 处理完输入, 然后就去构造数。 然后广搜一遍即可
代码:
#include #include #include #include #include #include #include #include #include #include #include #include #include #define lson l, m, rt<<1#define rson m+1, r, rt<<1|1#define mem0(a) memset(a,0,sizeof(a))#define sca(x) scanf("%d",&x)#define de printf("=======\n")typedef long long ll;using namespace std;struct node { bool yo; int value; node * l; node * r; node() { yo = false; value = 0; l = r = NULL; } };node * root;bool failed;vector ans;int cnt;node * new_node() { return new node();}void addnode( int v, char * p ) { int n = (int)strlen(p); node * u = root; for( int i = 0; i < n; i++ ) { if( p[i] == 'L' ) { if( u->l == NULL ) u->l = new_node(); u = u->l; } else if( p[i] == 'R' ) { if( u->r == NULL ) u->r = new_node(); u = u->r; } } if( u->yo == true ) { failed = true; return; } u->value = v; u->yo = true;}bool readin() { char s[290]; while( 1 ) { if( scanf( "%s", s ) != 1 ) return false; if( strcmp(s, "()") == 0 ) break; int v; sscanf( &s[1], "%d", &v ); addnode( v, strchr(s, ',')+1 ); } return true;}bool bfs() { queue q; q.push(root); while( !q.empty() ) { node * temp = q.front(); q.pop(); if( temp->yo == false ) return 0; ans.push_back(temp->value); if( temp->l ) q.push(temp->l); if( temp->r ) q.push(temp->r); } return 1;}int main() { while(1) { cnt = 0; failed = 0; root = new_node(); ans.clear(); if( !readin() ) break; if( !failed && bfs() ) { int len = (int)ans.size(); for (int i = 0; i < len; i++) printf("%d%c", ans[i], i == len - 1 ? '\n' : ' '); } else { puts( "not complete" ); } } return 0;}
思考: 了解到一些很好用函数, 然后知道了每次对指针进行操作的时候都要判空, 我觉得数据结构和数学两大块儿真的是具重要, 原本打算打完今年的区域赛就退役了,但是为了学习各种的数据结构和数学, 我还是得继续打下去啊.....刷题还是不能断啊老哥, 然后我是真的想进橘子娱乐啊........我他妈是真的想进啊, 和我实在是太适合了, 然后现在就是非常非常非常难熬了.......
转载于:https://www.cnblogs.com/FriskyPuppy/p/7496562.html