用栈实现数的后序遍历
用栈实现数的后序遍历
void Postorder(BiTree T){
Stack S; //用于记录根和字根结点
InitStack(S);//初始化栈
BiNode *p=T://临时变量记录记录当前访问的结点
BiNode *r = NULL;//临时变量,记录上一个访问到的结点,因为从右边访问根结点必定是右子树已经遍历完了,此时上一个访问的结点必定是右子树的根结点
while(p || !IsEmpty(S)){
if(p!=NULL){
push(S,p);
p = p->lchild;
}else{
GetTop(S,p);//只读取根结点,不对栈内结点进行操作
//没有对右子树进行操作过
if(p->rchild != NULL && p->rchild != r){
p = p->rchild;
push(S,p);
p = p->lchild;
}else{
pop(S,p);
visit(p);//对p进行访问,可以进行打印等操作
r = p;//记录当前访问的是p结点
p == NULL;//把p置空,进入下一次循环,直到栈内无元素,且p为空时遍历完成
}//else
}//else
}//while
}
弱智icoding nmsl
#include <stdio.h>
#include "bitree.h" //请不要删除,否则检查不通过
bool path(BiTNode* root, BiTNode* node, Stack* s){
BiTNode *r = NULL;
if (root == NULL || node == NULL) return false;
while(root || !is_empty(s)){
if(root != NULL){
push(s,root);
if(root == node) return true;
root = root->left;
}else{
top(s,&root);
if(root->right != NULL && root->right != r){
root = root->right;
}else{
pop(s,&root);
r = root;
root = NULL;
}//else
}//else
}//while
return false;
}
最精简的树的后序遍历版本
#include <stdlib.h>
#include <stdio.h>
#include "bitree.h" //请不要删除,否则检查不通过
bool path(BiTNode* root, BiTNode* node, Stack* s){
BiTNode *r = NULL;
if (root == NULL || node == NULL) return false;
while(root || !is_empty(s)){
while(root != NULL){
push(s,root);
if(root == node) return true;
root = root->left;
}
top(s,&root);
if(root->right == NULL || root->right == r){
pop(s,&root);
r = root;
root = NULL;
}else{
root = root->right;
}//else
}//while
return false;
}