UVa 122 Trees on the level

题意:给出一棵二叉树,按照从上到下,从左到右输出所有节点的值,如果有一个节点没有赋值或者被多次赋值则输出not complete

看的紫书照着敲的= = 先要将输入进来的值建成一颗二叉树(定义一个二叉树的节点,新建节点的函数,添加节点的函数),再对建好的二叉树遍历(BFS)

 1 #include<iostream>  

 2 #include<cstdio>  

 3 #include<cstring> 

 4 #include <cmath>  

 5 #include<vector> 

 6 #include<queue>

 7 #include<algorithm>  

 8 using namespace std;

 9 

10 typedef long long LL;

11 const int maxn=10000+5;

12 char s[maxn];

13 int failed;

14 vector<int> ans;

15 

16 struct Node{ //建立二叉树的一个结点 

17     bool have_value;//判断该结点是否被赋值过 

18     int v;

19     Node *left,*right;

20     Node():have_value(false),left(NULL),right(NULL){}//构造函数,即为赋初值 

21 };

22 

23 Node*root;

24 Node* newnode() { //创建一个新的结点 

25     return new Node();

26 }

27 

28 void addnode(int v,char *s){ //添加一个新的 结点 

29     int n=strlen(s);

30     Node* u=root;

31     for(int i=0;i<n;i++)

32     if(s[i]=='L'){

33         if(u->left==NULL) u->left=newnode();//如果左边的结点不存在,建立新的结点 

34         u=u->left; //向左走 

35     }

36     else if(s[i]=='R'){

37         if(u->right==NULL) u->right=newnode();//如果右边的结点不存在,建立新的结点 

38         u=u->right;//向右走 

39     }

40     if(u->have_value) failed=true; //如果已经赋过值 ,输入有误 

41     u->v=v;//标记 

42     u->have_value=true;    

43 }

44 

45 bool read_input(){

46     failed=false;

47     root=newnode();

48     for(;;){

49         if(scanf("%s",&s)!=1) return false;

50         if(!strcmp(s,"()")) break;

51         int v;

52         sscanf(&s[1],"%d",&v);

53         addnode(v,strchr(s,',')+1);

54     }

55     return true;

56 }

57 

58 

59 

60 

61 bool bfs(vector<int>& ans){

62     queue<Node*> q;

63     ans.clear();

64     q.push(root);

65     while(!q.empty()){

66         Node* u=q.front();q.pop();

67         if(!u->have_value) return false;//有结点没有被赋值,输出有误 

68         ans.push_back(u->v);//增加到输出序列尾部 

69         if(u->left!=NULL) q.push(u->left);//如果存在左子结点,放进队列 

70         if(u->right!=NULL) q.push(u->right);//    如果存在右子结点,放进队列

71     }

72     return true;

73 }

74 

75 int main()

76 {

77     int i;

78     while(read_input()){

79         if(failed||!bfs(ans)) printf("not complete\n");

80         else{

81             for(i=0;i<ans.size()-1;i++)

82             printf("%d ",ans[i]);

83             printf("%d\n",ans[i]);                    

84         }

85     }

86     return 0;    

87 }
View Code

 

 

 

 

 

 

 

 

数据结构学得好艰辛啊啊啊啊啊= =

你可能感兴趣的:(level)