18#include <unordered_map>
44 std::vector<Node*>&
GetChild() {
return _child; }
45 const std::vector<Node*>&
GetChild()
const {
return _child; }
49 std::vector<Node*> _child;
60 if (!_allNode.empty())
66 _allNode.push_back(node);
79 Node* node =
new Node(v, node_parent);
80 _allNode.push_back(node);
81 node_parent->_child.push_back(node);
86 Node* node_parent =
Get(parent);
92 return Add(v, node_parent);
101 Node* node_parent = _allNode.front();
102 Node* node =
new Node(v, node_parent);
103 _allNode.push_back(node);
104 node_parent->_child.push_back(node);
113 auto iter = std::find(_allNode.begin(), _allNode.end(), node);
114 if (iter == _allNode.end())
120 auto iter1 = std::find(node->_parent->_child.begin(), node->_parent->_child.end(), node);
121 if (iter1 == node->_parent->_child.end())
126 node->_parent->_child.erase(iter1);
129 for (
Node* node_child : node->_child)
131 node->_parent->_child.push_back(node_child);
132 node_child->_parent = node->_parent;
137 _allNode.erase(iter);
145 for (
Node* node : _allNode)
157 for (
Node* iter : _allNode)
190 auto& vec_child = node->_parent->
GetChild();
191 auto iter_child = std::find(vec_child.begin(), vec_child.end(), node);
192 if (iter_child == vec_child.end())
197 vec_child.erase(iter_child);
198 parent->_child.push_back(node);
199 node->_parent = parent;
207 if (_allNode.empty())
211 s.push(_allNode.front());
215 Node* node_this = s.top();
220 auto& c = node_this->_child;
221 for (
auto iter = c.rbegin(); iter != c.rend(); ++iter)
232 template<
typename T1,
typename F>
239 for (NodeSelf* node : _allNode)
246 std::unordered_map<const NodeOther*, NodeSelf*> map_ptr;
248 for (
const NodeOther* node_b : b.
GetAll())
250 NodeSelf* node =
new NodeSelf(0,
nullptr);
251 _allNode.push_back(node);
253 map_ptr[node_b] = node;
256 for (
const NodeOther* node_b : b.
GetAll())
258 NodeSelf* node = map_ptr[node_b];
259 node->_parent = map_ptr[node_b->GetParent()];
260 for (
auto& iter : node_b->GetChild())
262 node->_child.push_back(map_ptr[iter]);
264 func(node_b->GetValue(), node->_v);
275 if (_allNode.empty())
277 return _allNode.front();
282 return _allNode.size();
286 auto begin() {
return _allNode.begin(); }
287 auto end() {
return _allNode.end(); }
292 for (
Node* node : _allNode)
298 std::list<Node*> _allNode;
const std::vector< Node * > & GetChild() const
const T & GetValue() const
Node(const T &v, Node *parent)
const Node * GetParent() const
std::vector< Node * > & GetChild()
void ForEach(F func)
遍历,保证父节点先遍历
const Node * GetRoot() const
返回根节点,空树返回空
const std::list< Node * > & GetAll() const
返回所有节点
Node * Get(T v)
查找,失败返回nullptr
auto begin()
标准库迭代方法不保证父节点先遍历
Node * PushBack(const T &v)
第一个添加的为根节点,其他均为根节点的子节点
void Copy(const NTree< T1 > &b, F func)
从另一个树填充
void SetParent(Node *node, Node *parent)
修改父节点
Node * AddRoot(const T &v)
添加根节点
Node * Add(const T &v, Node *node_parent)
添加子节点
Node * Add(const T &v, const T &parent)
size_t GetSize() const
返回总数量
void log_err0(std::string_view str, DL_SOURCE_LOCATION)