我们可以使用先序遍历,中序遍历,后序遍历二叉树进行数据的访问:
我们可以使用这样的递归代码来做处理:
struct Node { int value; Node* left; Node* right; }
void inorder_traverse(Node* node) { if(NULL != node->left) { inorder_traverse(node->left); } doSomething(node); if(NULL != node->right) { inorder_traverse(node->right); } }
有时我们使用迭代器进行二叉树的处理,我们先使用一种非递归的方法进行二叉树的节点的访问:
void inorder_traverse_onorecursive(Node* node) { Stack stack; do { while(NULL != node) { stack.push(node); node = node->left; } do { Node* top = stack.top(); stack.pop(); doSomething(top); if(NULL != top->right) { node = top->right; break; } }while(!stack.empty()); }while(!stack.empty()); }
class Iterator { public: Iterator(); ~Iterator(); virtual Node* next() = 0; }; //Next is implementation class InorderIterator : public Iterator { public: InorderIterator(Node* node) { Node * current = node; while(NULL != current) { mStack.push(current); current = current->left; } } virtual Node* next() { if(mStack.empty()) { return NULL; } Node* node = mStack.top(); mStack.pop(); if(NULL != top->right) { Node* current = top->right; while(NULL != current) { mStack.push(current); current = current->left; } } return top; } private: std::stack<Node*> mStack; };