ツリー全体を単一の配列、場合によってはベクトルに格納することを検討してください。あなたが構造を持っているとしましょうNode
:
struct Node
{
int val;
vector<size_t> children;
};
vector<Node> tree;
次に、tree[0]
はツリーのルートです。特定のノードに新しいブランチを追加するたびに、たとえば、次のtree[i]
ようにします。
tree.resize(tree.size()+1);
tree[i].children.push_back(tree.size()-1);
// you can also set the value of the new node:
tree.back().val = 123;
次に、任意のノード(ルートを含む)から開始してその子を調べることにより、ツリーを簡単にトラバースできます。
DFSを使用してツリーをトラバースする例を次に示します。
void dfs(size_t x)
{
// you can do sth here, for example:
printf("node: %d, number of children: %d\n", x, tree[x].children.size());
// go deeper in the tree to the node's children:
for (size_t i=0; i<tree[x].children.size(); ++i)
dfs(tree[x].children[i]);
}
// starting DFS from the root:
dfs(0);
このようにして、ツリーのメモリを予約できます。
tree.reserve(100);