2020/07/06更新一下,这篇文章的没有注释,对于萌新理解起来比较困难,下面推荐另一篇文章,解释很好:二叉树的非递归遍历
CreateBinTee.h
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
template<class T> class BinaryTree;
template<class T>
class BinTreeNode
{
friend class BinaryTree<T>;
public:
T data;
private:
BinTreeNode *lchild;
BinTreeNode *rchild;
};
template<class T>
class BinaryTree
{
public:
BinaryTree(){root = 0;};
~BinaryTree(){ Destory(root); }
void Destory(BinTreeNode<T> *&p);
void CreateBinTree();
void CreateBinTree(BinTreeNode<T> *&p);
void PreOrderNoRescur();
void PreOrderNoRescur(BinTreeNode<T> *&p);
void PreOrderNoRescur1();
void PreOrderNoRescur1(BinTreeNode<T> *&p);
void InOrderNoRescur();
void InOrderNoRescur(BinTreeNode<T> *&p);
void PostOrderNoRescur();
void PostOrderNoRescur(BinTreeNode<T> *&p);
void LevelOrderNoRescur();
void LevelOrderNoRescur(BinTreeNode<T> *&p);
private:
BinTreeNode<T> *root;
};
template<class T>
void BinaryTree<T>::Destory(BinTreeNode<T> *&p)
{
if (p != NULL)
{
Destory(root->lchild);
Destory(root->rchild);
delete root;
root = NULL;
}
}
template<class T>
void BinaryTree<T>::CreateBinTree()
{
cout << "请以‘*’结尾" << endl;
CreateBinTree(root);
}
template<class T>
void BinaryTree<T>::CreateBinTree(BinTreeNode<T> *&p)
{
T ch;
if ((ch = getchar()) == '#')
p = 0;
else
{
p = new BinTreeNode<T>();
p->data = ch;
CreateBinTree(p->lchild);
CreateBinTree(p->rchild);
}
}
template<class T>
void BinaryTree<T>::PreOrderNoRescur()
{
cout << "前序非递归(根-左-右)遍历为:" << endl;
PreOrderNoRescur(root);
}
template<class T>
void BinaryTree<T>::PreOrderNoRescur(BinTreeNode<T> *&p)
{
stack<BinTreeNode<T> *> S;
S.push(NULL);
while (p != NULL)
{
cout << p->data << ' ';
if (p->rchild != NULL)
S.push(p->rchild);
if (p->lchild != NULL)
p = p->lchild;
else
{
p = S.top();
S.pop();
}
}
}
template<class T>
void BinaryTree<T>::PreOrderNoRescur1()
{
cout << "前序非递归(根-左-右)遍历为:" << endl;
PreOrderNoRescur(root);
}
template<class T>
void BinaryTree<T>::PreOrderNoRescur1(BinTreeNode<T> *&p)
{
stack<BinTreeNode<T> *> S;
BinTreeNode<T> *t;
S.push(p);
while (!s.empty())
{
t = S.top();
S.pop();
cout << t->data << ' ';
if (t->rchild != NULL)
S.push(t->rchild);
if (t->lchild != NULL)
S.push(t->lchild);
}
}
template<class T>
void BinaryTree<T>::InOrderNoRescur()
{
cout << "中序非递归(左-根-右)遍历为:" << endl;
InOrderNoRescur(root);
}
template<class T>
void BinaryTree<T>::InOrderNoRescur(BinTreeNode<T> *&p)
{
stack<BinTreeNode<T> *> S;
do
{
while (p != NULL)
{
S.push(p);
p = p->lchild;
}
if (!S.empty())
{
p = S.top();
S.pop();
cout << p->data << ' ';
p = p->rchild;
}
} while (p != NULL || !S.empty());
}
template<class T>
void BinaryTree<T>::PostOrderNoRescur()
{
cout << "后序非递归(左-右-根)遍历为:" << endl;
PostOrderNoRescur(root);
}
template<class T>
void BinaryTree<T>::PostOrderNoRescur(BinTreeNode<T> *&p)
{
if (root == NULL)
return;
stack<BinTreeNode<T> *> s;
s.push(p);
BinTreeNode<T> *lastPop = NULL;
while (!s.empty())
{
while (s.top()->lchild != NULL)
s.push(s.top()->lchild);
while (!s.empty())
{
//右叶子结点 || 没有右结点
if (lastPop == s.top()->rchild || s.top()->rchild == NULL)
{
cout << s.top()->data << " ";
lastPop = s.top();
s.pop();
}
else if (s.top()->rchild != NULL)
{
s.push(s.top()->rchild);
break;
}
}
}
}
template<class T>
void BinaryTree<T>::LevelOrderNoRescur()
{
cout << "层序非递归遍历为:" << endl;
LevelOrderNoRescur(root);
}
template<class T>
void BinaryTree<T>::LevelOrderNoRescur(BinTreeNode<T> *&p)
{
queue<BinTreeNode<T> *> Q;
Q.push(p);
BinTreeNode<T> *t;
while (!Q.empty())
{
t = Q.front();
Q.pop();
cout << t->data << ' ';
if (t->lchild != NULL)
Q.push(t->lchild);
if (t->rchild != NULL)
Q.push(t->rchild);
}
}
main.cpp
#include"CreateBinaryTree.h"
#include<iostream>
using namespace std;
int main()
{
BinaryTree<char> tree;
tree.CreateBinTree();
cout << "请选择遍历方式:" << endl;
cout << "a、前序非递归:" << endl;
cout << "b、前序非递归1:" << endl;
cout << "c、中序非递归:" << endl;
cout << "d、后序非递归:" << endl;
cout << "e、层序遍历:" << endl;
// 恢复cin正常状态,两个一起使用
cin.sync(); //清除缓冲区
cin.clear(); //清除错误状态
cin.ignore();//vs2017要加这句。。
char c;
cout << "请输入遍历方法:";
cin >> c;
switch (c)
{
case 'a':
tree.PreOrderNoRescur();
break;
case 'b':
tree.PreOrderNoRescur1();
break;
case 'c':
tree.InOrderNoRescur();
break;
case 'd':
tree.PostOrderNoRescur();
break;
case 'e':
tree.LevelOrderNoRescur();
break;
}
cout << endl;
system("pause");
return 0;
}