#include
#include <stdlib.h>
#include
#include<string.h>
using namespace std;
typedef struct TreeNode{
TreeNode *right;
TreeNode *left;
char e;
}TreeNode,*PTree;
void CreatTree(PTree &T){
char a;
scanf("%c",&a);
if(a==’#’){//ABDG##H###CE#I##F##
T=NULL;
}
else{
T = (PTree)malloc(sizeof(TreeNode));
T->e=a;
CreatTree(T->left);
CreatTree(T->right);
}
}
void PreOrderTravel(PTree T){
if(TNULL)
return;
printf("%c ",T->e);
PreOrderTravel(T->left);
PreOrderTravel(T->right);
}
void InOrderTravel(PTree T){
if(TNULL)
return;
InOrderTravel(T->left);
printf("%c “,T->e);
InOrderTravel(T->right);
}
void TailOrderTravel(PTree T){
if(T==NULL)
return;
TailOrderTravel(T->left);
TailOrderTravel(T->right);
printf(”%c ",T->e);
}
void Prestacktravel(PTree T){
stack<TreeNode *> s;
if(T!=NULL)
s.push(T);
printf("非递归前序 ");
while(!s.empty()){
PTree p=s.top();
s.pop();
printf("%c ",p->e);
if(p->right!=NULL) s.push(p->right);
if(p->left!=NULL) s.push(p->left);
}
}
void Instacktravel(PTree T){
stack<TreeNode *> s;
PTree p=T;
printf("非递归中序 “);
while(!s.empty()||p!=NULL){
if(p!=NULL){
s.push§;
p=p->left;
}else{
p=s.top();
s.pop();
printf(”%c ",p->e);
p=p->right;
}
}
}
void Tailstacktravel(PTree T){
stack<TreeNode *> s;
PTree p=T,q=NULL;
printf("非递归后序 “);
do{
while(p!=NULL){
s.push§;
p=p->left;
}
q=NULL;
while(!s.empty()){
p=s.top();
s.pop();
if(p->right==q){
printf(”%c ",p->e);
q=p;
}else{
s.push§;
p=p->right;
break;
}
}
}while(!s.empty());
}
int main(){
PTree T=NULL;
T = (PTree)malloc(sizeof(TreeNode));//此处不论是否为T申请内存都不影响最终结果,
// 但是这点使我很疑惑,如果此处申请内存,在creaTree函数中继续申请内存,不是重复了吗?或者说是空置了一个
//答:地址传递
CreatTree(T);
printf(“前序递归”);
PreOrderTravel(T);
printf("\n");
printf(“中序递归”);
InOrderTravel(T);
printf("\n");
printf(“后序递归”);
TailOrderTravel(T);
printf("\n");
Prestacktravel(T);
printf("\n");
Instacktravel(T);
printf("\n");
Tailstacktravel(T);
}
#include<iostream>
#include <stdlib.h>
#include<stack>
#include<string.h>
using namespace std;
typedef struct TreeNode{
TreeNode *right;
TreeNode *left;
char e;
}TreeNode,*PTree;
void CreatTree(PTree &T){
char a;
scanf("%c",&a);
if(a=='#'){//ABDG##H###CE#I##F##
T=NULL;
}
else{
T = (PTree)malloc(sizeof(TreeNode));
T->e=a;
CreatTree(T->left);
CreatTree(T->right);
}
}
void PreOrderTravel(PTree T){
if(T==NULL)
return;
printf("%c ",T->e);
PreOrderTravel(T->left);
PreOrderTravel(T->right);
}
void InOrderTravel(PTree T){
if(T==NULL)
return;
InOrderTravel(T->left);
printf("%c ",T->e);
InOrderTravel(T->right);
}
void TailOrderTravel(PTree T){
if(T==NULL)
return;
TailOrderTravel(T->left);
TailOrderTravel(T->right);
printf("%c ",T->e);
}
void Prestacktravel(PTree T){
stack<TreeNode *> s;
if(T!=NULL)
s.push(T);
printf("非递归前序 ");
while(!s.empty()){
PTree p=s.top();
s.pop();
printf("%c ",p->e);
if(p->right!=NULL) s.push(p->right);
if(p->left!=NULL) s.push(p->left);
}
}
void Instacktravel(PTree T){
stack<TreeNode *> s;
PTree p=T;
printf("非递归中序 ");
while(!s.empty()||p!=NULL){
if(p!=NULL){
s.push(p);
p=p->left;
}else{
p=s.top();
s.pop();
printf("%c ",p->e);
p=p->right;
}
}
}
void Tailstacktravel(PTree T){
stack<TreeNode *> s;
PTree p=T,q=NULL;
printf("非递归后序 ");
do{
while(p!=NULL){
s.push(p);
p=p->left;
}
q=NULL;
while(!s.empty()){
p=s.top();
s.pop();
if(p->right==q){
printf("%c ",p->e);
q=p;
}else{
s.push(p);
p=p->right;
break;
}
}
}while(!s.empty());
}
int main(){
PTree T=NULL;
T = (PTree)malloc(sizeof(TreeNode));//此处不论是否为T申请内存都不影响最终结果,
// 但是这点使我很疑惑,如果此处申请内存,在creaTree函数中继续申请内存,不是重复了吗?或者说是空置了一个
//答:地址传递
CreatTree(T);
printf("前序递归");
PreOrderTravel(T);
printf("\n");
printf("中序递归");
InOrderTravel(T);
printf("\n");
printf("后序递归");
TailOrderTravel(T);
printf("\n");
Prestacktravel(T);
printf("\n");
Instacktravel(T);
printf("\n");
Tailstacktravel(T);
}