File: tree.hpp

package info (click to toggle)
taskflow 3.9.0%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 45,948 kB
  • sloc: cpp: 39,058; xml: 35,572; python: 12,935; javascript: 1,732; makefile: 59; sh: 16
file content (52 lines) | stat: -rw-r--r-- 974 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#pragma once

#include <vector>
#include <cassert>
#include <cmath>

//full tree
// child nodes' index = degree * idx ~ degree * (idx + 1) - 1
class Tree : public Graph {

  public:

    Tree(int degree, int level);

    ~Tree();

  private:

    int _degree;
};


Tree::Tree(int degree, int level): _degree{degree}, Graph{level}
{
  assert(_level != 0 && _degree != 0);
  _graph.resize(_level);

  for(int l = 0; l < _level; ++l) {
    size_t id{0};

    std::vector<Node> cur_level_nodes;
    size_t cur_level_num_nodes = std::pow(_degree, l);
    cur_level_nodes.reserve(cur_level_num_nodes);

    for(size_t n = 0; n < cur_level_num_nodes; ++n) {
      std::vector<size_t> out_nodes(_degree);
      std::iota(out_nodes.begin(), out_nodes.end(), id * _degree);
      cur_level_nodes.emplace_back(l, id++, out_nodes);
    }

    _graph[l] = std::move(cur_level_nodes);

    _num_nodes += cur_level_num_nodes;
  }

  allocate_nodes();

}

Tree::~Tree() {
  free_nodes();
}