从函数遍历树类
Traversing a tree class from a function
我有一个树类-见下文-我想遍历树类外部的函数并进行一些处理。为了遍历树,我需要设置一个指向树根的指针。但是我不能访问类之外的根,因为它是私有的。
有没有一种方法可以在不使用getter(检索根地址)的情况下优雅地实现这一点,并且在不公开根的情况下?
谢谢你的帮助。
template <class Key> class IntervalST
{
private:
Interval<Key> *root;
bool isRed(Interval<Key> *interval);
Interval<Key> *rotateLeft(Interval<Key> *h);
Interval<Key> *rotateRight(Interval<Key> *h);
Interval<Key> *put(Interval<Key> *h,Key lo, Key hi, Key val);
Interval<Key> *moveRedLeft(Interval<Key> *h);
Interval<Key> *moveRedRight(Interval<Key> *h);
Interval<Key> *deleteMin(Interval<Key> *h, Key hi);
Interval<Key> *balance(Interval<Key> *h);
Interval<Key> *remove(Interval<Key> *h, Key lo, Key hi);
Interval<Key> *min(Interval<Key> *h);
Interval<Key> *addDuplicate(Interval<Key> *h, Key hi);
Interval<Key> *removeDuplicate(Interval<Key> *h, Key low, Key hi);
Interval<Key> *getPointerToKey(Key low);
void flipColors(Interval<Key> *h);
void destroy(Interval<Key> *h);
void printTree(Interval<Key> *h, int indent);
Key maxVal(Interval<Key> *h);
int size(Interval<Key> *h);
bool isBST(Interval<Key> *x, Key min, Key max);
inline bool isBST(){return isBST(root,0,0);}
bool isSizeConsistent(Interval<Key> *x);
inline bool isSizeConsistent(){return isSizeConsistent(root);}
bool is23(Interval<Key> *x);
inline bool is23(){return is23(root);}
bool isBalanced();
bool isBalanced(Interval<Key> *x,int black);
int getKeySize(Key low);
int compare(Key a, Key b);
public:
//don't forget to build the constructor
//and overload the =equal operator
IntervalST():root(NULL){};
~IntervalST();
void remove(Key lo, Key hi);
void put(Key lo, Key hi);
inline int size(){return size(root);}
inline bool isEmpty(){return root == NULL;}
void print(int indent = 0);
void check();
};
您可以向树类添加接受函数指针的方法,这样您就可以向它传递一个函数,该函数将在树的每个节点上执行。这保持了在树中遍历封装,同时允许将指针传递到要在每个节点上执行的任何函数。
像这样:
void IntervalST::executeOnEachNode(void (*functor)(Interval<Key> node,void* userData),
void *userData = 0)
{
Interval<Key> node;
//Loop to traverse your tree stepping through each node
{
//Calls functor with supplied user data on specific node (
functor(node,userData);
}
}
其中,functor是指向接受一个参数(void*)的函数的指针-userData,如果需要,可以使用它向函数传递绑定的附加参数。
用例(计算所有树节点):
void countAllNodes(Interval<Key> node,void* additionalIntArgument)
{
int* count = static_cast<int*>(additionalIntArgument);
*count += 1;
}
IntervalST<double> tree;
int count(0);
tree.executeOnEachNode(countAllNodes,reinterpret_cast<void*>(&count));
std::cout << "Tree has "<<count << " nodes "<<std::endl;
您想要的是类的迭代器。它很可能会被定义为一个朋友,这样它就可以看到内部。否则,您需要公开方法进行访问。
定义我自己容器的迭代器以获取详细信息。
相关文章:
- 如何在可变参数模板函数中遍历可变参数元组?
- 是否可以遍历传递给函数的数组?
- 模板类和遍历的无效构造函数
- 在使用 In Order 遍历成员函数时引发异常(堆栈溢出)时出现问题
- 编写一个通用遍历函数,允许灵活地处理具有不同参数的多个函数
- C++ 用于 BFS 遍历的 lambda 函数
- 如何调用遍历类层次结构的成员函数
- C++,一个通用递归模板函数,用于遍历树状结构
- 是否可以在 constexpr 函数中遍历枚举成员,因此值为 constexpr
- 二叉树顺序遍历错误:没有用于调用的匹配函数
- 如何遍历函数[i]()
- 遍历宏定义的函数
- 是否有一个函数用于遍历POSIX环境变量
- 从函数遍历树类
- 如何在C++中循环遍历多个函数
- 遍历二叉树的函数
- C++二进制树遍历和函数指针参数
- 在c++中循环遍历函数的所有参数
- 如何在C++中调用递归链表遍历函数
- 定义遍历函数的const和非const版本