- 前序周游二叉树
template <class T>
void BinaryTree<T>::PreOrderWithoutRecursion(BinaryTreeNode<T>* root)
{
using std::stack;
stack<BinaryTreeNode<T>*> aStack;
BinaryTreeNode<T>* pointer = root;
while (!aStack.empty()||pointer) {
if (pointer) {
Visit(pointer->value());
aStack.push(pointer);
pointer = pointer->leftchiled();
} else {
pointer = aStack.top();
aStack.pop();
pointer = pointer->rightchild();
}
}
}
- 中序周游二叉树
template <class T>
void BinaryTree<T>::InOrderWithoutRecursion(BinaryTreeNode<T>* root)
{
using std::stack;
stack<BinaryTreeNode<T>*> aStack;
BinaryTreeNode<T>* pointer = root;
while (!aStack.empty()||pointer) {
if (pointer) {
aStack.push(pointer);
pointer = pointer->leftchiled();
} else {
pointer = aStack.top();
Visit(pointer->value());
pointer = pointer->rightchild();
aStack.pop();
}
}
}
- 后序周游二叉树
template <class T>
void BinaryTree<T>::PostOrderWithoutRecursion(BinaryTreeNode<T>* root)
{
using std::stack;
stack<BinaryTreeNode<T>*> aStack;
BinaryTreeNode<T>* pointer = root;
BinaryTreeNode<T>* lastVisite = NULL;
while (!aStack.empty()||pointer) {
if (pointer) {
aStack.push(pointer);
pointer = pointer->leftchiled();
} else {
pointer = aStack.top();
if (pointer->rightchild() == NULL || lastVisite == pointer->rightchild()) {
Visit(pointer->value());
lastVisite = pointer;
aStack.pop();
pointer = NULL;
} else
pointer = pointer->rightchild();
}
}
}
- 层次周游二叉树
template <class T>
void BinaryTree<T>::PostOrderWithoutRecursion(BinaryTreeNode<T>* root)
{
using std::queue;
queue<BinaryTreeNode<T>*> aQueue;
BinaryTreeNode<T>* pointer = root;
if (pointer)
aQueue.push(pointer);
while(!aQueue.empty()) {
pointer = aQueue.front();
Visit(pointer->value());
aQueue.pop();
if (pointer->->leftchiled())
aQueue.push(pointer->->leftchiled());
if (pointer = pointer->rightchild())
aQueue.push(pointer = pointer->rightchild());
}
}