题意:

输入一颗二叉树,按照(左右左右, 节点的值)的格式。然后从上到下从左到右依次输出各个节点的值,如果一个节点没有赋值或者多次赋值,则输出“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 }
代码君一

相关文章: