gpt4 book ai didi

c++ - 在 tree.hh 中移动任意节点及其子节点作为子节点

转载 作者:行者123 更新时间:2023-11-28 04:51:46 25 4
gpt4 key购买 nike

我正在使用 tree.hh执行。我有一个简单的“树”,如下所示(A、B 和 C 是没有 parent 的 sibling ,B1 是 B 的 child ):

A
B
B1
C

现在我想将 C“移动”为 B 的子代。我尝试了以下最小示例,但没有找到使用 tree.hh 中的方法执行此操作的简单方法。 .

我找到的唯一解决方案是:

  1. 从 C 及其子树中提取一个子树(将其从原始树中移除)
  2. 将 C 的子树作为子树附加到所需的新父 B

See code on pastebin.com

#include <iostream>
#include "tree.hh"
#include "tree_util.hh"

void print_tree(const tree<std::string>& tr)
{
tree<std::string>::pre_order_iterator it = tr.begin();
tree<std::string>::pre_order_iterator end = tr.end();
if(!tr.is_valid(it)) return;
int rootdepth=tr.depth(it);
std::cout << "-----" << std::endl;
while(it!=end) {
for(int i=0; i<tr.depth(it)-rootdepth; ++i)
std::cout << " ";
std::cout << (*it) << std::endl << std::flush;
++it;
}
std::cout << "-----" << std::endl;
}

int main(int, char **)
{
tree<std::string> my_tree;

tree<std::string>::iterator iA = my_tree.insert(my_tree.end(), "A");
tree<std::string>::iterator iB = my_tree.insert(my_tree.end(), "B");
tree<std::string>::iterator iB1 = my_tree.append_child(iB, "B1");
tree<std::string>::iterator iC = my_tree.insert(my_tree.end(), "C");
print_tree(my_tree);

// this makes a copy of "C" --> not what I want
auto iC_append = my_tree.append_child(iB, iC);
print_tree(my_tree);
my_tree.erase(iC_append);

// this extracts "C" into a separate tree and then appends the tree as child to "B"
tree<std::string> sub_tree = my_tree.move_out(iC);
my_tree.move_in_as_nth_child(iB, my_tree.number_of_children(iB), sub_tree);
print_tree(my_tree);
}

我怀疑这是最简单的解决方案。知道我做错了什么吗?

谢谢!

干杯,乔纳森

最佳答案

使用move_after,如

my_tree.move_after(iB1, iC);

这会将位于 iC 的节点(以及任何子节点,如果存在)移动到 B 的兄弟节点。

关于c++ - 在 tree.hh 中移动任意节点及其子节点作为子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48064796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com