二叉树的建立及前中后及按层次遍历

I.二叉树的建立(此处采用的是前序建立)
如果要建立,如下图所示的二叉树,我们应该怎么做?
二叉树的建立及前中后及按层次遍历_第1张图片
首先,我们要先建立第一个结点,如果按照前序遍历的方法,首先,判断他的左儿子是否存在(我在这里使用的是如果value值为-1则说明该结点的左儿子不存在),直到不存在,回到上一个结点,判断他的右儿子是否存在…依次类推
下面是建树的代码,这里使用的是非二叉链表的形式。

int counted = 0;  //6 2 7 2 -1 -1 4 -1 -1 8 5 -1 -1 -1 1 4 -1 -1 1 -1 -1
struct tree
{
    int value = 0;  //储存值
    int lchild = 0;   //储存左儿子的编号
    int rchild = 0;    //储存左儿子的编号
};
tree b[maxn];
int creattree()  //前序建树
{
    int temp = 0;
    int v = 0;
    cin>>v;
    if(v != -1)  
    {
        counted++;  //此处的counted相当于是new出一个新结点
        temp = counted;  //利用一个临时变量储存counted的值,因为他是全局变量,如果在下面的函数中它的值发生了改变,其值也会改变,所以用一个临时储存他的值
        b[temp].value = v;  //填入数据
        b[temp].lchild = creattree();
        b[temp].rchild = creattree();  //递归的过程可以自己手动模拟体会一下,对递归的理解会更加深刻
    }
    return temp;
}

前中后遍历
以下模拟一下中序遍历的过程,先给出代码:

void getmidresult(int num)
{
     if(num != 0)
     {
        getmidresult(b[num].lchild);
        cout<<b[num].value<<" ";
        getmidresult(b[num].rchild);
     }
}

二叉树的建立及前中后及按层次遍历_第2张图片
(有点乱,但应该还是能看…当然这个递归的过程最好还是自己理解一下比较好)
层次遍历:(其实就是我们常讲的bfs遍历)
即利用队列的先进先出的特点,来进行二叉树的层次遍历。

void getbfsresult(int num)
{
    q.push(b[num]);
    while(!q.empty())  //在队列非空时
    {
        tree temp = q.front();  //取出队列头部的值
        if(temp.lchild != 0)q.push(b[temp.lchild]);  //如果有左儿子,则入队
        if(temp.rchild != 0)q.push(b[temp.rchild]);   //如果有右儿子,则入队
        cout<<temp.value<<" ";   //输出队列顶端的数
        q.pop();  //利用队列先进先出的特点,实现层次遍历
    }
}

完整代码

#include
#include
using namespace std;
const int maxn = 1e8;
int counted = 0;  
struct tree
{
    int value = 0;  //储存值
    int lchild = 0;   //储存左儿子的编号
    int rchild = 0;    //储存左儿子的编号
};
tree b[maxn];
queue<tree>q;
int creattree();  //建树函数,这里采用的是前序建立,所以得到的前序遍历函数就是建立的顺序
void getpreresult(int num);  //前序遍历函数
void getmidresult(int num);  //中序遍历函数
void getbackresult(int num); //后序遍历函数
void getbfsresult(int num);
void countedspc();  //获取各个特性结点的函数
int main()
{
    int t = creattree();
    cout<<"The Preorder traversal results is :";
    getpreresult(1);
    cout<<endl;
    cout<<"The midorder traversal results is :";
    getmidresult(1);
    cout<<endl;
    cout<<"The backorder traversal results is :";
    getbackresult(1);
    cout<<endl;
    cout<<"The leftchild of each node: ";
        for(int i = 1 ; i <= 10 ; i++)
            cout<<b[i].lchild<<" ";
    cout<<endl;
            cout<<"The rightchild of each node: ";
            for(int i = 1 ; i <= 10 ; i++)
                cout<<b[i].rchild<<" ";
    cout<<endl;
    countedspc();
    cout<<"The bfs result is :";
    getbfsresult(1);
    return 0;
}
int creattree()  //前序建树
{
    int temp = 0;
    int v = 0;
    cin>>v;
    if(v != -1)
    {
        counted++;
        temp = counted;
        b[temp].value = v;
        b[temp].lchild = creattree();
        b[temp].rchild = creattree();
    }
    return temp;
}
void getpreresult(int num)
{
    if(num != 0)
    {
        cout<<b[num].value<<" ";
        getpreresult(b[num].lchild);
        getpreresult(b[num].rchild);
    }
}
void getmidresult(int num)
{
     if(num != 0)
     {
        getmidresult(b[num].lchild);
        cout<<b[num].value<<" ";
        getmidresult(b[num].rchild);
     }
}
void getbackresult(int num)
{
     if(num != 0)
     {
        getbackresult(b[num].lchild);
        getbackresult(b[num].rchild);
        cout<<b[num].value<<" ";
     }
}
void countedspc()
{
    int Max = -10000 , Min = 9999999;
    int Number_d1 = 0, Number_d2 = 0 , Number_l = 0;
    for(int i = 1 ; i <= counted ; i++)
    {
        Max = max(Max , b[i].value);
        Min = min(Min , b[i].value);
        if(b[i].lchild != 0 && b[i].rchild != 0)
            Number_d2++;
        else if(b[i].lchild == 0 && b[i].rchild == 0)
            Number_l++;
        else
            Number_d1++;
    }
    cout<<"The number of nodes that have two degrees:"<<Number_d2<<endl;
    cout<<"The number of nodes that have one degree:"<<Number_d1<<endl;
    cout<<"The number of nodes that are leaves :"<<Number_l<<endl;
    cout<<"The min of the nodes is : "<<Min<<endl;
    cout<<"The max of the nodes is : "<<Max<<endl;
}
void getbfsresult(int num)
{
    q.push(b[num]);
    while(!q.empty())
    {
        tree temp = q.front();
        if(temp.lchild != 0)q.push(b[temp.lchild]);
        if(temp.rchild != 0)q.push(b[temp.rchild]);
        cout<<temp.value<<" ";
        q.pop();
    }
}

运行结果:
二叉树的建立及前中后及按层次遍历_第3张图片

你可能感兴趣的:(c++,二叉树)