递归方法:
//先序遍历
void PreOrder(BiTree T){
if(T!=NULL){
cout<<T->data<<" ";
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
//中序遍历
void InOrder(BiTree T){
if(T!=NULL){
PreOrder(T->lchild);
cout<<T->data<<" ";
PreOrder(T->rchild);
}
}
//后序遍历
void AfterOrder(BiTree T){
if(T!=NULL){
PreOrder(T->lchild);
PreOrder(T->rchild);
cout<<T->data<<" ";
}
}
非递归方法:
//非递归调用的先序遍历
void PreOrderTree(BiTree T){
stack<BiNode *> s;
while(T||!s.empty()){
while(T){
cout<<T->data;
s.push(T);
T=T->lchild;
}
if(!s.empty()){
T=s.top();
s.pop();
T=T->rchild;
}
}
cout<<endl;
}
//非递归调用的中序遍历
void InOrderTree(BiTree T){
stack<BiNode *> s;
while(T||!s.empty()){
while(T){
s.push(T);
T=T->lchild;
}
if(!s.empty()){
T=s.top();
s.pop();
cout<<T->data;
T=T->rchild;
}
}
cout<<endl;
}
//非递归调用的后序遍历
void AfterOrderTree(BiTree T){
stack<BiNode*> s;
BiNode* lastVisited = NULL; // 记录上一个访问过的结点
while (T || !s.empty()) {
while (T) {
s.push(T);
T = T->lchild;
}
if (!s.empty()) {
BiNode* topNode = s.top();
if (topNode->rchild && topNode->rchild != lastVisited) {
T = topNode->rchild;
} else {
cout << topNode->data;
lastVisited = topNode;
s.pop();
}
}
}
cout << endl;
}