如果没有用递归的话,就要用栈保存之前的节点
中序遍历二叉树:首先要先便利左子树,然后就可以输出原节点了,然后在遍历右子树,如果某节点的右子树遍历完了或者右子树为空了,说明以这个节点为根的二叉树遍历完了,此时从栈中退出上一个节点并访问它,再向他的右子树遍历下去
后序遍历二叉树:在算法中,先用栈暂存根节点,再向左子树遍历下去,此时根节点的标记为L,当访问完左子树中的节点并从左子树中退回时,还要去遍历根的右子树,此时根节点的标记为r,在从右子树退出时才能访问位于栈顶的根节点的值
void InOrder(Tree *root) {//利用栈中序遍历非递归算法
stack<Tree *> s;//
Tree *temp = root;
do{
while(temp!= NULL) {//遍历左子树
s.push(temp);
temp = temp->left;
}
if(!s.empty()) {//避免传入的是空树,遍历右子树
temp = s.top();
printf("%c", temp->data);
s.pop();
temp = temp->right;
}jjjjjjjjjjjjjjjjj
}while(temp != NULL || !s.empty());//直到没有节点了和栈为空
}
void PostOrder(Tree *root) {//利用栈后序遍历非递归算法
Tree *temp = root;
sktNode *w;
stack<sktNode *>s;
do {
while(temp != NULL) {//遍历左子树,并将其标志为L,为后面确保是否都遍历过了该节点以下的节点做了标志
w->ptr = temp;
w->tag = 'L';
s.push(w);
temp = temp->left;
}
int con = 1;
while(con && !s.empty()) {//设置con为标记是为了标记是否还存在没有遍历完的点
w = s.top();
s.pop();
temp = w->ptr;
switch(w->tag) {
case 'L':w->tag = 'R';s.push(w);//将其转化为R,并遍历它的右节点,表示该节点的左节点已经遍历过了,如果右节点便利完了就可一输出了
temp = temp->right;
con = 0;
break;
case 'R':printf("%c",temp->data);
}
}
}while(!s.empty());
}