标签:
题意:给出一棵二叉树,按照从上到下,从左到右输出所有节点的值,如果有一个节点没有赋值或者被多次赋值则输出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 }
数据结构学得好艰辛啊啊啊啊啊= =
标签:
原文地址:http://www.cnblogs.com/wuyuewoniu/p/4324629.html