//节点定义
template <class T>
struct binaryTreeNode
{
T element;
binaryTreeNode<T> *leftChild, // left subtree
*rightChild; // right subtree
binaryTreeNode() {leftChild = rightChild = NULL;}
binaryTreeNode(const T& theElement):element(theElement)
{
leftChild = rightChild = NULL;
}
binaryTreeNode(const T& theElement,
binaryTreeNode *theLeftChild,
binaryTreeNode *theRightChild)
:element(theElement)
{
leftChild = theLeftChild;
rightChild = theRightChild;
}
};template <class T>
void visit(binaryTreeNode<T> *x)
{// visit node *x, just output element field.
cout << x->element << ' ';
}
//前序遍历(递归算法)
template <class T>
void preOrder(binaryTreeNode<T> *t)
{// Preorder traversal of *t.
if (t != NULL)
{
visit(t); // visit tree root
preOrder(t->leftChild); // do left subtree
preOrder(t->rightChild); // do right subtree
}
}
//中序遍历
template <class T>
void inOrder(binaryTreeNode<T> *t)
{// Inorder traversal of *t.
if (t != NULL)
{
inOrder(t->leftChild); // do left subtree
visit(t); // visit tree root
inOrder(t->rightChild); // do right subtree
}
}
//后序遍历
template <class T>
void postOrder(binaryTreeNode<T> *t)
{// Postorder traversal of *t.
if (t != NULL)
{
postOrder(t->leftChild); // do left subtree
postOrder(t->rightChild); // do right subtree
visit(t); // visit tree root
}
}
//逐层遍历 非递归template <class T>
void levelOrder(binaryTreeNode<T> *t)
{// Level-order traversal of *t.
queue<binaryTreeNode<T>*> q; //队列
while (t != NULL)
{
visit(t); // visit t
// put t's children on queue
if (t->leftChild != NULL)
q.push(t->leftChild);
if (t->rightChild != NULL)
q.push(t->rightChild);
// get next node to visit
try {t = q.front();}
catch (queueEmpty) {return;}
q.pop();
}
}