先序建立二叉树、非递归实现先序遍历和中序遍历、队列实现层次遍历
先序建立二叉树,#表示空结点。
使用栈,实现非递归先序遍历和中序遍历。
使用队列实现层次遍历。
直接上代码,寒假完善注释,甚至从头到尾把《数据结构与算法》的相关代码写一遍。
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
typedef char DataType;
#define MAXSIZE 100
typedef struct node
{
DataType data;
struct node *lchild;
struct node *rchild;
}BiTreeNode,*BiTree;
//先序建立二叉树
void CreateBiTree(BiTree &root)
{
char c;
cin>>c;
if(c=='#')
{
root=NULL;
}
else
{
root=(BiTree)malloc(sizeof(BiTreeNode));
root->data=c;
CreateBiTree(root->lchild);
CreateBiTree(root->rchild);
}
}
//递归实现先序遍历
void PreOrder(BiTree root)
{
if(root!=NULL)
{
cout<<root->data<<" ";
PreOrder(root->lchild);
PreOrder(root->rchild);
}
}
//递归实现中序遍历
void InOrder(BiTree root)
{
if(root!=NULL)
{
InOrder(root->lchild);
cout<<root->data<<" ";
InOrder(root->rchild);
}
}
//递归实现后序遍历
void PostOrder(BiTree root)
{
if(root!=NULL)
{
PostOrder(root->lchild);
PostOrder(root->rchild);
cout<<root->data<<" ";
}
}
//非递归实现先序遍历
void NonPreOrder(BiTree root)
{
BiTree S[MAXSIZE];
BiTree p;
int top=-1;
S[++top]=root;
while(top!=-1)
{
p=S[top--];
cout<<p->data<<" ";
if(p->rchild!=NULL) S[++top]=p->rchild;
if(p->lchild!=NULL) S[++top]=p->lchild;
}
}
//非递归实现中序遍历
void NonInOrder(BiTree root)
{
BiTree S[MAXSIZE];
BiTree p=root;
int top=-1;
while(top!=-1 || p!=NULL)
{
while(p!=NULL)
{
S[++top]=p;
p=p->lchild;
}
if(top!=-1)
{
p=S[top--];
cout<<p->data<<" ";
p=p->rchild;
}
}
}
//队列实现层次遍历
void LevelOrder(BiTree root)
{
BiTree Queue[MAXSIZE];
int front=-1;
int rear=0;
Queue[rear]=root;
while(rear!=front)
{
cout<<Queue[++front]->data<<" ";
if(Queue[front]->lchild) Queue[++rear]=Queue[front]->lchild;
if(Queue[front]->rchild) Queue[++rear]=Queue[front]->rchild;
}
}
//测试序列:ABD##E##CF###
int main()
{
BiTree root;
CreateBiTree(root);
cout<<"递归先序遍历: ";
PreOrder(root);
cout<<endl;
cout<<"非递归先序遍历: ";
NonPreOrder(root);
cout<<endl;
cout<<"递归中序遍历: ";
InOrder(root);
cout<<endl;
cout<<"非递归中序遍历: ";
NonInOrder(root);
cout<<endl;
cout<<"递归后序遍历: ";
PostOrder(root);
cout<<endl;
cout<<"层次遍历: ";
LevelOrder(root);
cout<<endl;
system("pause");
return 0;
}