#include<bits/stdc++.h>
using namespace std;
typedef struct BiTNode
{
int data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
//初始化
int InitTree(BiTree &T)
{
int a;
cin>>a;
if (-1 == a)
T = NULL;
else
{
T = new BiTNode;
T->data = a;
InitTree(T->lchild);
InitTree(T->rchild);
}
return 0;
}
//前序遍历递归
void PreOrder(BiTree T)
{
if (T != NULL)
{
printf("%d ", T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
//中序遍历递归
void InOrder(BiTree T)
{
if (T != NULL)
{
InOrder(T->lchild);
printf("%d ", T->data);
InOrder(T->rchild);
}
}
//后序遍历递归
void PostOrder(BiTree T)
{
if (T != NULL)
{
PostOrder(T->lchild);
PostOrder(T->rchild);
printf("%d ", T->data);
}
}
//层序遍历非递归
void LevelOrder(BiTree T)
{
queue<BiTNode> q;
if (T != NULL)
{
BiTNode temp;
q.push(*T);
while (!q.empty())
{
temp = q.front();
q.pop();
printf("%d ", temp.data);
if (temp.lchild != NULL)
q.push(*temp.lchild);
if (temp.rchild != NULL)
q.push(*temp.rchild);
}
}
}
//前序遍历非递归
void PreOrder2(BiTree T){
if(T==NULL){
return ;
}
stack<BiTNode*>s;
s.push(T);
while(!s.empty()){
BiTree p=s.top();
cout<<p->data<<" ";
s.pop();
if(p->rchild){
s.push(p->rchild);
}
if(p->lchild){
s.push(p->lchild);
}
}
}
//中序遍历非递归
void InOrder2(BiTree T){
if(T==nullptr){
return ;
}
stack<BiTNode*>s;
BiTNode *p=T;
while(!s.empty()||p){
if(p!=nullptr){
s.push(p);
p=p->lchild;
}else{
p=s.top();
s.pop();
cout<<p->data<<" ";
p=p->rchild;
}
}
}
//后序遍历非递归
void PostOrder2(BiTree T){
if(T==NULL){
return ;
}
stack<BiTNode*>s;
stack<int>res;
s.push(T);
while(!s.empty()){
BiTree p=s.top();
res.push(p->data);
s.pop();
if(p->lchild){
s.push(p->lchild);
}
if(p->rchild){
s.push(p->rchild);
}
}
while(!res.empty()){
cout<<res.top()<<" ";
res.pop();
}
}
void List(){
cout<<"输入节点(int类型) 按照前序遍历输入 如果为空 输入-1"<<endl;
cout<<"例如 1 2 -1 -1 3 -1 -1 表示一颗以1为根节点 2为左孩子 3为右孩子的树"<<endl;
BiTree T;
InitTree(T);
cout<<"前序遍历递归:";
PreOrder(T);
cout<<endl;
cout<<"前序遍历非递归:";
PreOrder2(T);
cout<<endl;
cout<<"中序遍历递归:";
InOrder(T);
cout<<endl;
cout<<"中序遍历非递归:";
InOrder2(T);
cout<<endl;
cout<<"后序遍历递归:";
PostOrder(T);
cout<<endl;
cout<<"后序遍历非递归:";
PostOrder2(T);
cout<<endl;
cout<<"层序遍历非递归:";
LevelOrder(T);
cout<<endl;
}
int main()
{
List();
}
c++递归非递归实现二叉树的遍历前 中 后 层序遍历完整代码
最新推荐文章于 2024-09-10 08:28:20 发布