二叉树的创建与遍历及其应用

版权声明:转载必须注明出处,违者必究。 https://blog.csdn.net/qq_41856518/article/details/85242238

 二叉树是最简单也是最常用的树,下面我用二叉链表的形式创建一颗二叉树,并将其分别用前序、中序、后序遍历,然后求其叶子节点数和深度。

#include<iostream>
#include<cmath>
using namespace std;
struct binode            //定义节点结构体
{
    char data;
    binode *lchild;
    binode *rchild;
};
class bitree
{
public:
    binode *root;
    bitree(){root=creattree(root);}
    ~bitree(){}
    binode *creattree(binode *bt)    //创建树
    {
        char ch;
        cin>>ch;
        if(ch=='#')bt=NULL;        //输入“#”代表空
        else
            {
                bt=new binode;      //为要创建的节点开辟空间
                bt->data=ch;
                bt->lchild=creattree(bt->lchild); //递归创建左子树
                bt->rchild=creattree(bt->rchild); //递归创建右子树
            }
            return bt;
    }
    void preoder(binode *bt)   //前序遍历
    {
        if(!bt)return;
        else
        {
            cout<<bt->data<<" "; //根节点
            preoder(bt->lchild); //左子树
            preoder(bt->rchild); //右子树
        }
    }
    void inoder(binode *bt)  //中序遍历
    {
        if(!bt)return;
        else
        {
            inoder(bt->lchild);  //左子树
            cout<<bt->data<<" "; //根节点
            inoder(bt->rchild);  //右子树
        }
    }
    void postoder(binode *bt)    //后序遍历
    {
        if(!bt)return ;
        else
        {
            postoder(bt->lchild); //右子树
            postoder(bt->rchild);  //左子树
            cout<<bt->data<<" ";   //根节点
        } 
    }
    int  leaves(binode *bt)   //求叶子节点数
    {

        if(!bt)return 0;
        if(!bt->lchild&&!bt->rchild)return 1;//左子树和右子树都为空,即叶子节点
        else return leaves(bt->lchild)+leaves(bt->rchild);
    }
    int depth(binode *bt)     //求树的深度
    {
        if(!bt)return 0;
        int m=depth(bt->lchild);
        int n=depth(bt->rchild);
        return max(m,n)+1;
    }
};
int main()
{
    bitree t;
    cout<<"前序遍历为:";
    t.preoder(t.root);cout<<endl;
    cout<<"中序遍历为:";
    t.inoder(t.root);cout<<endl;
    cout<<"后序遍历为:";
    t.postoder(t.root);cout<<endl;
    cout<<"叶子节点数为:"<<t.leaves(t.root)<<endl;
    cout<<"树的深度为:"<<t.depth(t.root)<<endl;
}

运行截图:

猜你喜欢

转载自blog.csdn.net/qq_41856518/article/details/85242238
今日推荐