下面是基于栈的二叉树循环遍历代码:
#include <stack>
#include <queue>
#define New(type) (type*)malloc(sizeof(type))
struct BinaryTreeNode {
int value;
struct BinaryTreeNode *left;
struct BinaryTreeNode *right;
};
void preOrder_loop(BinaryTreeNode *tree) {
if (NULL == tree) {
return;
}
std::stack<BinaryTreeNode*> treeStack;
while (tree || !treeStack.empty()) {
if (tree) {
printf("%d ", tree->value);
if (tree->right)
treeStack.push(tree->right);
tree = tree->left;
}
else {
tree = treeStack.top();
treeStack.pop();
}
}
}
void inOrder_loop(BinaryTreeNode *tree) {
if (NULL == tree) {
return;
}
std::stack<BinaryTreeNode*> treeStack;
while (tree || !treeStack.empty()) {
if (tree) {
treeStack.push(tree); //把沿途结点入栈, 这些结点的值没有打印, 其右子树没有访问
tree = tree->left; //往左走到底
}
else {
tree = treeStack.top(); //弹一个结点出来
treeStack.pop();
printf("%d ", tree->value); //打印值
tree = tree->right; //访问右子树
}
}
}
void postOrder_loop(BinaryTreeNode *tree) {
if (NULL == tree) {
return;
}
std::stack<BinaryTreeNode*> treeStack;
while (tree || !treeStack.empty()) {
if (tree) {
treeStack.push(tree); //把沿途结点入栈, 这些结点的右子树没有访问, 其值没有打印
tree = tree->left; //往左走到底
}
else { //某个结点的左子树或左右子树已经访问完毕
tree = treeStack.top(); //弹一个结点出来
treeStack.pop();
if (NULL == tree) {
tree = treeStack.top();
treeStack.pop();
printf("%d ", tree->value);
tree = NULL; //以该结点为根的子树已经遍历完毕
}
else {
treeStack.push(tree);
treeStack.push(NULL);
tree = tree->right; //访问右子树
}
}
}
}