题意:
输入一颗二叉树,按照(左右左右, 节点的值)的格式。然后从上到下从左到右依次输出各个节点的值,如果一个节点没有赋值或者多次赋值,则输出“not complete”
一、指针方式实现二叉树
首先定义一个结构体,然后定义一个结构体指针root,作为整棵树的根节点。如果需要用到左右节点则申请一个空间,也就是用不到的就不申请,以节省空间。
遍历方式是广度优先遍历(BFS),从根节点依次拓展子节点,如果有子节点就入队,然后根节点出队。继续拓展,直到队列为空,即遍历完整棵树。
因为指针丢失以后会造成内存泄露,所以在每次读取二叉树之前都要释放掉上一棵树申请的内存,二叉树的删除也是递归删除的。
1 #define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <vector> 6 #include <queue> 7 8 const int maxn = 300; 9 char s[maxn]; 10 bool failed; 11 std::vector<int> ans; 12 13 struct Node 14 { 15 bool have_value; //是否赋值过 16 int v; 17 Node *left, *right; 18 Node():have_value(false), left(NULL), right(NULL) {} //构造函数 19 }; 20 Node* root; 21 22 Node* newnode() { return new Node(); } //调用构造函数 23 24 void addnode(int v, char* s) 25 { 26 int n = strlen(s); 27 Node* u = root; 28 for(int i = 0; i < n; ++i) 29 { 30 if(s[i] == 'L') 31 { 32 if(u->left == NULL) u->left = newnode(); 33 u = u->left; 34 } 35 else if(s[i] == 'R') 36 { 37 if(u->right == NULL) u->right = newnode(); 38 u = u->right; 39 } 40 } 41 if(u->have_value) failed = true; //如果一个节点有多次赋值,做标记 42 u->v = v; 43 u->have_value = true; 44 } 45 46 void remove_tree(Node* u) 47 { 48 if(u == NULL) return; 49 remove_tree(u->left); 50 remove_tree(u->right); 51 delete u; 52 } 53 54 bool read_input(void) 55 { 56 failed = false; 57 remove_tree(root); 58 root = newnode(); 59 60 for(;;) 61 { 62 if(scanf("%s", s) != 1) return false; 63 if(!strcmp(s, "()")) break; 64 int v; 65 sscanf(&s[1], "%d", &v); 66 addnode(v, strchr(s, ',') + 1); 67 } 68 return true; 69 } 70 71 bool BFS(std::vector<int>& ans) 72 { 73 std::queue<Node*> q; 74 ans.clear(); 75 q.push(root); 76 while(!q.empty()) 77 { 78 Node* u = q.front(); 79 q.pop(); 80 if(!u->have_value) return false; //该节点没有赋值过 81 ans.push_back(u->v); 82 if(u->left != NULL) q.push(u->left); 83 if(u->right != NULL) q.push(u->right); 84 } 85 return true; 86 } 87 88 int main(void) 89 { 90 #ifdef LOCAL 91 freopen("122in.txt", "r", stdin); 92 #endif 93 94 while(read_input()) 95 { 96 if(failed || !BFS(ans)) printf("not complete\n"); 97 else 98 { 99 printf("%d", ans[0]); 100 for(int i = 1; i < ans.size(); ++i) 101 printf(" %d", ans[i]); 102 puts(""); 103 } 104 } 105 106 return 0; 107 }