ツリー全体を単一の配列(おそらくベクトル)に格納することを検討することもできます。あなたが構造Node
を持っているとしましょう:
struct Node
{
int val;
vector<size_t> children;
};
vector<Node> tree;
その後tree[0]
は、ツリーのルートです。
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;
その後、あなたは(ルートを含む)の任意のノードから始まり、その子を見ることにより、簡単にツリーをトラバースすることができます:あなたは、特定のノードに新しいブランチを追加するたびに、あなたはない、のは、tree[i]
を言わせて。ここで
は、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);
あなたがすることはできません。実際のベクトルだけがメモリを予約できます。'branches'には実際のベクトル(* space *のみ)が含まれていないので、誰が何かを予約できる人はいません。 –
@KerrekSB私は問題を表現するためにいくつかのコードを提供しましたが、私の質問は 'std :: vector'に限られていません。 – doc