NodePtr Add(T elem) { auto pos = TreeSearch(elem, root, root); if(repeat) while(get<2>(pos)) pos = TreeSearch(elem, get<0>(pos)->Right(false), get<0>(pos)); else if(get<2>(pos)) return get<0>(pos); NodePtr node = get<0>(pos); NodePtr nodePar = get<1>(pos); if(root == nullptr) { root.reset(new Node<T>(elem)); return node; } else { if(comp(elem, nodePar->elem)) { nodePar->Left(false).reset(new Node<T>(elem)); node = nodePar->Left(); } else { nodePar->Right(false).reset(new Node<T>(elem)); node = nodePar->Right(); } } return node; }
tuple<NodePtr, NodePtr, bool> TreeSearch(T elem, NodePtr node, NodePtr nodePar) const { if(node == nullptr) return make_tuple(node, nodePar, false); else if(elem == node->elem) return make_tuple(node, nodePar, true); else if(comp(elem, node->elem)) return TreeSearch(elem, node->Left(false), node); else return TreeSearch(elem, node->Right(false), node); }
void postorder(NodePtr node, int x = 0) { if(node != nullptr) { postorder(node->Left(false), x + 1); postorder(node->Right(false), x + 1); } for(int i = 0; i < x; ++i) cout<<"| "; cout<<"|--"<<node<<endl; return; }
void inorderReverse(NodePtr node, int x = 0) { if(node != nullptr) { inorderReverse(node->Right(false), x + 1); } for(int i = 0; i < x; ++i) cout<<"| "; cout<<"|--"<<node<<endl; if(node != nullptr) { inorderReverse(node->Left(false), x + 1); } return; }