二叉树的遍历(一)

#include<iostream>
#include<stdlib.h> 
#define MAX 100  
/*
·先序遍历,中序遍历,后序遍历的递归算法及其类似 ,只是其输出语句的位置不同 
·层次遍历需要用到队列 
·先序遍历,中序遍历,后序遍历的非递归算法需要用到栈 
·先序遍历非递归 顺便计算叶子结点 
*/ 
using namespace std; 
int count=0;//用来计算叶子结点数 
char a[100];//用来存储叶子结点 
typedef struct node
{
    struct node *lchild;
    struct node *rchild;
    char data;
}BiTreeNode, *BiTree;

typedef struct{  //队列 
     BiTree *base;  
     int front;  
     int rear;  
}SqQueue;

void Init_Queue(SqQueue &s){  //初始化队列 
    s.base=(BiTree)malloc(MAX*sizeof(BiTreeNode));  
    s.front=0;s.rear=0;
} 

void In_Queue(SqQueue &s,BiTree T){//进队 
    s.base[s.rear]=T;
    s.rear++;
}

void Out_Queue(SqQueue &s){//出队 
    while(s.front!=s.rear){//队列不为空 
        cout<<s.base[s.front]->data<<" ";
        s.front++;
    }
}

void level_Order(SqQueue &s,BiTree T){
    if(T){
    In_Queue(s,T);//树根进队    
    }
    int k=s.front;
    while(k!=s.rear){
        if(s.base[k]->lchild!=NULL)//左孩子不是NULL,左孩子进队 
            In_Queue(s,(s.base[k])->lchild);
        if(s.base[k]->rchild!=NULL)//右孩子不是NULL,右孩子进队 
            In_Queue(s,s.base[k]->rchild);
        k++;    
    }
    Out_Queue(s);//输出队列中的值 
}
void createBiTree(BiTree &T)   
{
    char c;
    cin >> c;
    if('#'== c)
        T = NULL;
    else
    {
        T = new BiTreeNode;
        if(!T) exit(1);//存储空间分配失败 
        T->data=c;
        createBiTree(T->lchild);
        createBiTree(T->rchild);
    }
}
void preorder(BiTree T)//先序遍历非递归 
{

    if(T)
    {
        cout<<T->data<<" ";
        preorder(T->lchild);
        preorder(T->rchild);
            if(T->lchild==NULL&&T->rchild==NULL){//存储并计算叶子结点 
                a[count]=T->data;           
                count++;            
            }

    }

}
void midorder(BiTree T)//中序遍历非递归 
{
    if(T)
    {
        midorder(T->lchild);
        cout<<T->data<<" ";
        midorder(T->rchild);
    }
}
void postorder(BiTree T)//后序遍历非递归 
{
    if(T)
    {
        postorder(T->lchild);
        postorder(T->rchild);
        cout<<T->data<<" ";
    }
}
int main()
{
    BiTree T;
    createBiTree(T);
    SqQueue s;
    Init_Queue(s);
    cout<<"二叉树创建完成!"<<endl;
    cout<<"前序遍历二叉树:"<<endl;
    preorder(T);
    cout<<endl;
    cout<<"中序遍历二叉树:"<<endl;
    midorder(T);
    cout<<endl;
    cout<<"后序遍历二叉树:"<<endl;
    postorder(T);
    cout<<endl;
    cout<<"叶子节点总数为:"<<count<<endl; 
    cout<<"叶子节点有:"<<endl;
    for(int i =0;i<count;i++)
    cout<<a[i]<<"  "; 
    cout<<endl;
    cout<<"层次遍历二叉树:"<<endl; 
    level_Order(s,T);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值