二叉樹的基本操作--方法2


源程序:

//

//  main.cpp

//  bitree

//

//  Created by duanqibo on 2019/11/25.

//  Copyright © 2019年 duanqibo. All rights reserved.

//

 

#include <iostream>

#include <stdio.h>

using namespace std;

 

typedef struct binode

{

    char data;

    struct binode *lchild,*rchild;

}BinTree;

 

BinTree *creatbitree()

{

    BinTree *T;

    char ch;

    T=(BinTree *)malloc(sizeof(BinTree));

    scanf("%c",&ch);

    if(ch=='#')

        T=NULL;

    else

    {

        T->data=ch;

        T->lchild=creatbitree();

        T->rchild=creatbitree();

    }

        

    return T;

}

//遞歸的先序遍歷二叉樹

void preordertraverse(BinTree *T)

{

    if(T)

    {

        cout<<T->data<<" ";//輸出根結點

        preordertraverse(T->lchild);

        preordertraverse(T->rchild);

    }

}

//遞歸的中序遍歷二叉樹

void inordertraverse(BinTree *T)

{

    if(T)

    {

        inordertraverse(T->lchild);

        cout<<T->data<<" ";//輸出根結點

        inordertraverse(T->rchild);

    }

}

 

//遞歸的后序遍歷二叉樹

void postordertraverse(BinTree *T)

{

    if(T)

    {

        postordertraverse(T->lchild);

        postordertraverse(T->rchild);

        cout<<T->data<<" ";//輸出根結點

    }

}

 

//求二叉樹的深度

int depthofbitree(BinTree *T)

{

    int ldepth;

    int rdepth;

    if(T==NULL) //空樹

    {

        return 0;

    }

    

    ldepth=depthofbitree(T->lchild);

    rdepth=depthofbitree(T->rchild);

    

    if(ldepth>rdepth)

        return ldepth+1;

    else

        return rdepth+1;

}

 

//求二叉樹的葉子結點

int leafcount(BinTree *T)

{

    if(T==NULL)

    {

        return 0;

    }

    else if(T->lchild==NULL && T->rchild==NULL)

    {

        return 1;

    }

    else

    {

        int n=leafcount(T->lchild);//求左子樹葉子的數目

        int m=leafcount(T->rchild);//求右子樹葉子的數目

            return n+m;

    }

}

 

//求二叉樹T中度為1的結點的數量

int onesoncount(BinTree *T)

{

    if(T==NULL)

    {

        return 0;

    }

    else if((T->lchild==NULL && T->rchild!=NULL) ||(T->lchild!=NULL && T->rchild==NULL))

    {

        cout<<"度為1的結點的字母為:"<<T->data<<endl;

            return (onesoncount(T->lchild) +onesoncount(T->rchild) +1);

    }

    else

    {

        return (onesoncount(T->lchild) +onesoncount(T->rchild));

    }

}

 

//求非葉子結點的數目

int notleafcount(BinTree *T)

{

    if(T==NULL)

    {

        return 0;

    }

    else if(T->lchild == NULL && T->rchild == NULL)

        return 0;

    else

    {

        cout<<T->data; //輸出非終端結點的值

        int n=notleafcount(T->lchild); //左子樹非終端結點的數目

        int m=notleafcount(T->rchild); //右子樹非終端結點的數目

            return (m+n+1);

    }

}

 

//求二叉樹的全部結點數目

int node_num(BinTree *T)

{

    if(T==NULL)

        return 0;

    else

        return node_num(T->lchild)+node_num(T->rchild)+1;

}

int main()

{

    // insert code here...

    BinTree *t;

    printf("請按以下兩種序列輸入二叉樹的結點:\n");

    printf("AB#D##CE### 或 ABD##E##C#F##\n");

    t=creatbitree();

    cout<<"先序遍歷:";

    preordertraverse(t);

    cout<<endl;

    

    cout<<"中序遍歷:";

    inordertraverse(t);

    cout<<endl;

    

    cout<<"后序遍歷:";

    postordertraverse(t);

    cout<<endl;

    

    cout<<"二叉樹的深度為:"<<depthofbitree(t)<<endl;

    

    int leaf=0; //葉子結點數目,初始化為0

    leaf=leafcount(t);

    cout<<"葉子結點數為:"<<leaf<<endl;

    

    int oneson=0; //度為1的結點數目

    oneson=onesoncount(t);

    cout<<"度為1的結點的數量為:"<<oneson<<endl;

    

    int notleafcount_=0; //非葉子結點的數目,初始化為0

    cout<<"非葉子結點為:";/////////////

    notleafcount_=notleafcount(t);////

    cout<<endl;

    cout<<"非葉子結點的數量為:"<<notleafcount_<<endl;

    

    int node_number=0; //初始化全部結點的數目為0

    node_number=node_num(t);

    cout<<"二叉樹全部結點的數量為:"<<node_number<<endl;

}

 運行結果:

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM