zoukankan      html  css  js  c++  java
  • tree--

    用数组实现数--好像只能开一棵树

    #include <vector>
    #include <cstdio>
    #include <cstring>
    #include <queue>
    const int root = 1;
    int cnt;//记录节点数量
    const int max_nodenumber=256;
    int  value[max_nodenumber], left[max_nodenumber], right[max_nodenumber];
    bool have_value[max_nodenumber];
    using namespace std;
    bool failed;
    char s[max_nodenumber+10];
    void newtree()
    {
     cnt = root;//某一时刻只允许存在一棵树!!!!!!!!!!!!!!!!!!!
     left[root] = right[root] = NULL;
     have_value[root] = false;
    }
    int newnode()
    {
     cnt++;
     left[cnt] = right[cnt] = NULL;
     have_value[cnt] = false;
     return cnt;
    }
    void addnode(int v, char *s)
    {
     int n = strlen(s);
     int u = root;
     for (int i = 0;i < n - 1;i++)
     {
      if (s[i] == 'L')
      {
       if (left[u] == NULL)left[u] = newnode();
       u = left[u];
      }
      else if (s[i] == 'R')
      {
       if (right[u] == NULL)right[u] = newnode();
       u = right[u];
      }
     }
     if (have_value[u]==true)failed = true;//多次赋值
     value[u] = v;
     have_value[u] = true;//标记已赋值
    }
    void readinput()
    {
     failed = false;//新的开始,重设failed
     for (;;)
     {
      scanf("%s", s);
      if (!strcmp(s, "()"))break;
      int v;
      sscanf(s + 1, "%d", &v);
      addnode(v, strchr(s, ',') + 1);
     }
    }
    void remove_tree(int t)
    {
     if (t == NULL) { cnt = 0;return;}
     remove_tree(left[t]);
     remove_tree(right[t]);
     right[t] = left[t] = NULL;
     have_value[t] = false;
    }
    void bfs(vector<int> &ans,int start=root)
    {
     queue<int> q;
     q.push(start);
     while (!q.empty())
     {
      int u = q.front();
      q.pop();
      if (!have_value[u])failed = true;//结点未赋值
      ans.push_back(value[u]);
      if (left[u])q.push(left[u]);
      if (right[u])q.push(right[u]);
     }
    }
    vector<int> ans;
    int main(void)
    {
     //remember to memset()
     while (1)
     {
      newtree();
      //memset(have_value, 0, sizeof(have_value));
      //memset(left, 0, sizeof(left));
      //memset(right, 0, sizeof(right));//value没必要清空,有have_value作为标记
      ans.clear();
      readinput();
      bfs(ans);
      if(!failed)
       for (vector<int>::iterator it = ans.begin();it != ans.end();it++)
        printf("%d ", *it);
      else printf("%d",-1);
      printf("
    ");
      remove_tree(root);
      for (int i = 0;i < 30;i++)
       if (left[i]||right[i]||have_value[i])printf("未清除成功
    ");
     }
     return 0;
    }
     
     
    //链表实现
    #include <cstdio>
    #include <cstring>
    #include <vector>
    #include <queue>
    using namespace std;
    vector<int> ans;
    const int maxn = 25;
    using namespace std;
    char s[maxn];
    int failed;
    struct Node {
     bool have_value;
     int v;
     Node *left, *right;
     Node() :have_value(0), left(NULL), right(NULL){}
    };
    Node *root;
    Node* newnode() { return new Node(); }
    void addnode(int v, char* s);
    bool read_input()
    {
     failed=false;
     root = newnode();
     for (;;)
     {
      if (scanf("%s", s) != 1)return 0;
      if (!strcmp(s, "()"))break;
      int v;
      sscanf(&s[1], "%d", &v);
      addnode(v, strchr(s, ',') + 1);
     }
     return 1;//true
    }
    void addnode(int v, char *s)
    {
     int n = strlen(s);
     Node *u = root;
     for(int i=0;i<n-1;i++)//处理形如"LL)"
     { 
      if (s[i] == 'L')
      {
       if (u->left==NULL)u->left = newnode(); 
       u = u->left;
      }
      else if (s[i] == 'R')
      {
       if (u->right == NULL)u->right = newnode();
       u = u->right;
      }
     }
     if (u->have_value == 1)failed = true;//重复赋值爆炸了,输入错误
     u->v = v;
     u->have_value = true;
    }
    void bfs(vector<int> &ans)
    {
     queue<Node*> q;
     q.push(root);
     while (!q.empty())
     {
      Node *t = q.front();q.pop();
      if (t->have_value == 0)failed = true;//某一结点没有赋值,输入错误
      if (t->left)q.push(t->left);
      if (t->right)q.push(t->right);
      ans.push_back(t->v);
     }
    }
    void remove_tree(Node *root)
    {
     if (root == NULL)return;
     remove_tree(root->left);
     remove_tree(root->right);
     delete root;
    }
    int main(void)
    {
     if (!read_input())failed = true;
     bfs(ans);
     if (!failed)
     {
      for (vector<int>::iterator it = ans.begin();it != ans.end();it++)
       printf("%d ", *it);
      printf("
    ");
     }
     else 
      printf("%d", -failed);
     remove_tree(root);
     return 0;
    }
  • 相关阅读:
    腾讯精选50题算法【二叉搜索树的最近公共祖先】
    潜水一周,我精心整理了两个超级有用的职场生存之道
    全球用尽IPv4的一点思考
    Leetcode算法【114. 二叉树展开为链表】
    【翻译】全新16英寸MacBook Pro评测:开发人员的梦想成真
    Medium高赞系列,如何正确的在Stack Overflow提问
    Typora+PicGo+GitHub实现md自带图床效果
    SpringBoot输出日志到文件
    Mybatis用SQL做自连表查询
    IDEA实用插件推荐及使用方法详解
  • 原文地址:https://www.cnblogs.com/schsb/p/7834778.html
Copyright © 2011-2022 走看看