typedef char ElemType;
typedef struct BiTNode {
ElemType data;
BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
//前序遍历非递归算法
void PreOrderNotRecursion(BiTree T){
stack<BiTNode *> S;
BiTree p = T;
while (p || !S.empty()) {
while (p){
cout<<p->data<<" ";
S.push(p);
p = p->lchild;
}
p = S.top();
S.pop();
p = p->rchild;
}
}
// 前序遍历非递归用vector
vector<int> preorderTraversalUsevector(BiTree root){
vector<int> vec;
if(!root){
return vec;
}
vector<BiTree> nodes;
nodes.push_back(root);
while (!nodes.empty()){
BiTree p = nodes.back();
vec.push_back(p->data);
nodes.pop_back();
if(p->rchild)
nodes.push_back(p->rchild);
if(p->lchild)
nodes.push_back(p->lchild);
}
return vec;
}
//中序遍历非递归实现
void InOrderNotRecursion(BiTree T) {
stack<BiTNode *> S;
BiTree p = T;
while (p || !S.empty()) {
if (p) { //遍历左子树
S.push(p); //每遇到非空二叉树先向左走
p = p->lchild;
}
else {
p = S.top();
S.pop();
cout << p->data << " ";
p = p->rchild;
}
}
}
/*
* 后序遍历非递归算法实现
*/
void PostOrderNotRecursion(BiTree T) {
stack<BiTNode *> S;
BiTree p = T;
BiTree r = NULL; //用来记录最近访问的结点
while (p || !S.empty()) {
if (p) {
S.push(p);
p = p->lchild;
} else {
p = S.top();
if (p->rchild && p->rchild != r) { //如果右子树存在且未被访问过
p = p->rchild; //转向右
S.push(p);//再压入栈
p = p->lchild;//再走到最左
} else {
p = S.top();
S.pop();
cout << p->data << " ";
r = p; //记录最近访问过的结点
p = NULL; //结点访问完重置p指针,从而继续访问栈顶
}//else
}
}//while
}
//层次遍历
void LevelOrder(BiTree T) {
BiTree p;
queue<BiTree> Q;
Q.push(T);
while (!Q.empty()) {
p = Q.front();
Q.pop();
cout << p->data << " ";
if (p->lchild != NULL) {
Q.push(p->lchild);
}
if (p->rchild != NULL) {
Q.push(p->rchild);
}
}
}