递归和非递归实现二叉树的遍历

#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(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->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); 
    
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值