版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37345402/article/details/87303862
非递归解法如下:
输入:ABD^^EG^^^C^F^^
△前序遍历 A B D E G C F
△中序遍历 D B G E A C F
△后序遍历 D G E B F C A
△层次遍历 A B C D E F G
#include<stdio.h>
#include<stdlib.h>
#include<stack>
#include<queue>
using namespace std;
typedef struct BiTNode{
char data;
BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree &T)
{
char ch;
ch=getchar();
if(ch=='^')
T=NULL;
else{
T=(BiTree)malloc(sizeof(BiTree));
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void PreOrder(BiTree T){
stack<BiTree> S;
BiTree p=T;//p是遍历指针
while(p||!S.empty()){//栈不空或p不空时循环
while(p){//根指针进栈,遍历左子树
printf("%c ",p->data);
S.push(p);
p=p->lchild;
}
if(!S.empty())
{
p=S.top();
S.pop();
p=p->rchild;//遍历右子树
}
}
}
void InOrder(BiTree T){
stack<BiTree> S;
BiTree p=T;//p是遍历指针
while(p||!S.empty()){//栈不空或p不空时循环
if(p){//根指针进栈,遍历左子树
S.push(p);//遇到非空二叉树先向左走
p=p->lchild;
} else{
p=S.top();
S.pop();
printf("%c ",p->data);
p=p->rchild;//遍历右子树
}
}
}
void PostOrder(BiTree T){
stack<BiTree> S;
BiTree cur;
BiTree pre=NULL;
S.push(T);
while(!S.empty()){
cur=S.top();
//如果当前结点没有孩子结点或者孩子节点都已被访问过
if((cur->lchild==NULL&&cur->rchild==NULL)||
(pre!=NULL&&(pre==cur->lchild||pre==cur->rchild)))
{
printf("%c ",cur->data);
S.pop();
pre=cur;
}
else{
if(cur->rchild!=NULL)
S.push(cur->rchild);
if(cur->lchild!=NULL)
S.push(cur->lchild);
}
}
}
void LevelOrder(BiTree T){
queue<BiTree> Q;
BiTree p;
Q.push(T);//将根节点入队
while(!Q.empty()){//队不空时循环
p=Q.front();
Q.pop();
printf("%c ",p->data);//访问当前p所指向结点
if(p->lchild!=NULL){
Q.push(p->lchild);//左子树不空,则左子树入队列
}
if(p->rchild!=NULL){
Q.push(p->rchild);//右子树不空,则右子树入队列
}
}
}
int BiTreeDepth(BiTree T){
int HL,HR,MaxH;
if(T==NULL){ //空树深度为0
return 0;
}else{
HL=BiTreeDepth(T->lchild);//求左子树深度
HR=BiTreeDepth(T->rchild);//求右子树深度
MaxH=(HL>HR)?HL:HR;
return (MaxH+1);//返回树的深度
}
}
int main(){
BiTree T;
T=NULL;
CreateBiTree(T);
printf("————————————————————————————△前序遍历\n");
PreOrder(T);
printf("\n");
printf("————————————————————————————△中序遍历\n");
InOrder(T);
printf("\n");
printf("————————————————————————————△后序遍历\n");
PostOrder(T);
printf("\n");
printf("————————————————————————————△层次遍历\n");
LevelOrder(T);
printf("\n二叉树的深度为:%d\n",BiTreeDepth(T));
return 0;
}
//ABD^^EG^^^C^F^^
递归解法:
#include<stdio.h>
#include<stdlib.h>
#include<stack>
#include<queue>
using namespace std;
typedef struct BiTNode{
char data;
BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree &T)
{
char ch;
ch=getchar();
if(ch=='^')
T=NULL;
else{
T=(BiTree)malloc(sizeof(BiTree));
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void PreOrder(BiTree T){
if(T!=NULL){
printf("%c ",T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
void InOrder(BiTree T){
if(T!=NULL){
InOrder(T->lchild);
printf("%c ",T->data);
InOrder(T->rchild);
}
}
void PostOrder(BiTree T){
if(T!=NULL){
PostOrder(T->lchild);
PostOrder(T->rchild);
printf("%c ",T->data);
}
}
int main(){
BiTree T;
T=NULL;
CreateBiTree(T);
printf("————————————————————————————△前序遍历\n");
PreOrder(T);
printf("\n");
printf("————————————————————————————△中序遍历\n");
InOrder(T);
printf("\n");
printf("————————————————————————————△后序遍历\n");
PostOrder(T);
return 0;
}
//ABD^^EG^^^C^F^^