Basic operation and application of binary tree - data structure class C language

Table of contents

1. Function function (func.cpp)

2. Declaration file (before.h)

3. The main function (main.cpp)

4. Operating environment

1. Function function (func.cpp)

#include <iostream>
#include "before.h"

using namespace std;

status CreateBiTree(BiTree &T)
{
    char ch;
    scanf("%c",&ch);
    if(ch == '\n') return OK;
    if(ch == '#') T = NULL;
    else
    {
        T = (BiTree)malloc(sizeof(BiNode));
        T->data = ch;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }
}//先序遍历创建二叉树

status PreOrderTraverse(BiTree T)
{
    if(T == NULL) return OK;
    else
    {
        cout << T->data;
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
    }
}//先序遍历二叉树

status InOrderTraverse(BiTree T)
{
    if(T == NULL) return OK;
    else
    {
        InOrderTraverse(T->lchild);
        cout << T->data;
        InOrderTraverse(T->rchild);
    }
}//中序遍历二叉树

status PostOrderTraverse(BiTree T)
{
    if(T == NULL) return OK;
    else
    {
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        cout << T->data;
    }
}//后序遍历二叉树

status LevelTraverse(BiTree T)
{
    int MAX = CountNode(T);
    BiTree Queue[MAX+1],e;      //用一维数组表示队列
    int front,rear;
    front = rear = 0;
    if(T)
    {
        Queue[rear++] = T;      //根节点入队列
        while(front != rear)    //当队列非空
        {
            e = Queue[front++]; //队首元素出队列
            cout << e->data;
            if(e->lchild != NULL) Queue[rear++] = e->lchild;
            if(e->rchild != NULL) Queue[rear++] = e->rchild;
        }
    }
}//层次遍历

status BiTreeDepth(BiTree T)
{
    if(T == NULL) return ERROR;
    else
    {
        int maxL = BiTreeDepth(T->lchild);
        int maxR = BiTreeDepth(T->rchild);

        return maxL>maxR ? (maxL+1):(maxR+1);
    }
}//二叉树深度

status CountNode(BiTree T)
{
    if(T == NULL) return ERROR;
    else return CountNode(T->lchild)+ CountNode(T->rchild)+1;
}//二叉树总节点数

status Count0Node(BiTree T)
{
    if(T == NULL) return ERROR;
    else if(T->lchild == NULL && T->rchild == NULL) return 1;
    else return Count0Node(T->lchild)+ Count0Node(T->rchild);
}//二叉树叶子节点个数

status Count1Node(BiTree T)
{
    if(T == NULL) return ERROR;
    else if((T->lchild == NULL && T->rchild != NULL) || (T->lchild !=NULL && T->rchild == NULL))
        return Count1Node(T->lchild)+ Count1Node(T->rchild)+1;
    else return Count1Node(T->lchild)+ Count1Node(T->rchild);
}//二叉树度为1的节点个数

status Count2Node(BiTree T)
{
    if(T == NULL) return ERROR;
    else if(T->lchild != NULL && T->rchild != NULL) return Count2Node(T->lchild)+ Count2Node(T->rchild)+1;
    else return Count2Node(T->lchild)+ Count2Node(T->rchild);
}//二叉树度为2的节点个数

status ExchangeTree(BiTree &T)
{
    BiNode *temp;
    if(T == NULL) return OK;    //结束递归
    else
    {
        temp = T->lchild;
        T->lchild = T->rchild;
        T->rchild = temp;

        ExchangeTree(T->lchild);
        ExchangeTree(T->rchild);
    }
}//交换左右孩子

BiTree CopyTree(BiTree T)
{
    if(T == NULL) return NULL;
    else
    {
        BiTree copyTree = T;
        copyTree->lchild = CopyTree(T->lchild);
        copyTree->rchild = CopyTree(T->rchild);
        return copyTree;
    }
}//复制二叉树

status IsSameTree(BiTree A,BiTree B)
{
    if(A == NULL && B == NULL) return OK;
    if(A == NULL || B == NULL) return ERROR;
    if(A->data != B->data) return ERROR;

    return IsSameTree(A->lchild,B->lchild) && IsSameTree(A->rchild,B->rchild);
}//比较两个二叉树是否相等

void Menu()
{
    printf("\t\t\t************************此为二叉树的菜单***************************\n");
    printf("\t\t\t\t1、创建二叉树                       2、先序遍历二叉树             \n");
    printf("\t\t\t\t3、中序遍历二叉树                    4、后序遍历二叉树            \n");
    printf("\t\t\t\t5、二叉树深度                       6、二叉树总结点个数           \n");
    printf("\t\t\t\t7、二叉树叶子个数                    8、度为1的节点个数           \n");
    printf("\t\t\t\t9、度为2的节点个数                  10、交换左右孩子              \n");
    printf("\t\t\t\t11、复制二叉树                      12、比较两二叉树是否相等      \n");
    printf("\t\t\t\t13、层次遍历二叉树                  0、退出操作系统               \n");
    printf("\t\t\t*****************************************************************\n");
}//调用菜单

//
//Created by somewon on 2022/11/8.
//

2. Declaration file (before.h)

#ifndef _BEFORE_H
#define _BEFORE_H

#define OK 1
#define ERROR 0
#define OVERFLOW (-1)

typedef int status;
typedef char ElemType;

typedef struct BiNode
{
    ElemType data;
    struct BiNode *lchild;
    struct BiNode *rchild;
}BiNode,*BiTree;

status CreateBiTree(BiTree &T);                //先序遍历创建二叉树
status PreOrderTraverse(BiTree T);             //先序遍历二叉树
status InOrderTraverse(BiTree T);              //中序遍历二叉树
status PostOrderTraverse(BiTree T);            //后序遍历二叉树
status LevelTraverse(BiTree T);                //层次遍历二叉树
status BiTreeDepth(BiTree T);                  //二叉树深度
status CountNode(BiTree T);                    //二叉树总节点个数
status Count0Node(BiTree T);                   //二叉树叶子节点个数
status Count1Node(BiTree T);                   //二叉树度为1的节点个数
status Count2Node(BiTree T);                   //二叉树度为2的节点个数
status ExchangeTree(BiTree &T);                //交换左右孩子
BiTree CopyTree(BiTree T);                     //复制二叉树
status IsSameTree(BiTree A,BiTree B);          //比较两个二叉树是否相等

//菜单打印
void Menu();

#endif
//
//Created by somewon on 2022/11/8.
//

3. The main function (main.cpp)

#include <iostream>
#include "before.h"

using namespace std;

int main()
{
    int ch;
    int fine;
    BiTree T;
    BiTree L;
    do {
        Menu();
        cout << "--请输入你的选择:";
        cin >> ch;
        switch (ch)
        {
            case 1:
                T = NULL;
                cout << "--请输入符合二叉树先序次序的字符串:";
                getchar();
                CreateBiTree(T);
                cout << "当前二叉树T建立成功!其按先序输出为:" << endl;
                PreOrderTraverse(T);
                cout << endl;
                break;
            case 2:
                cout << "当前二叉树T按先序输出为:" << endl;
                PreOrderTraverse(T);
                cout << endl;
                break;
            case 3:
                cout << "当前二叉树T按中序输出为:" << endl;
                InOrderTraverse(T);
                cout << endl;
                break;
            case 4:
                cout << "当前二叉树T按后序输出为:" << endl;
                PostOrderTraverse(T);
                cout << endl;
                break;
            case 5:
                fine = BiTreeDepth(T);
                if(T == NULL) cout << "当前二叉树T为空!" << endl;
                else cout << "当前二叉树T的深度为:" << fine <<endl;
                break;
            case 6:
                fine = CountNode(T);
                if(T == NULL) cout << "当前二叉树T为空!无结点!" << endl;
                else cout << "当前二叉树T的总结点个数为:" << fine << endl;
                break;
            case 7:
                fine = Count0Node(T);
                if(T == NULL) cout << "当前二叉树T为空!无叶子结点!" << endl;
                else cout << "当前二叉树T的叶子结点个数为:" << fine << endl;
                break;
            case 8:
                fine = Count1Node(T);
                if(T == NULL) cout << "当前二叉树T为空!无度为1的结点!" << endl;
                else cout << "当前二叉树T度为1的节点个数为:" << fine << endl;
                break;
            case 9:
                fine = Count2Node(T);
                if(T == NULL) cout << "当前二叉树T为空!无度为2的结点!" << endl;
                else cout << "当前二叉树T度为2的结点个数为:" << fine << endl;
                break;
            case 10:
                fine = ExchangeTree(T);
                if(T == NULL) cout << "当前二叉树T为空!无法进行交换!" << endl;
                else if(fine == OK)
                {
                    cout << "当前二叉树T交换左右孩子成功!" << endl;
                    cout << "当前二叉树T按先序输出为:" << endl;
                    PreOrderTraverse(T);
                    cout << endl;
                    cout << "当前二叉树T按中序输出为:" << endl;
                    InOrderTraverse(T);
                    cout << endl;
                }
                break;
            case 11:
                BiTree S;
                S = CopyTree(T);
                if(S == NULL) cout << "当前二叉树T为空!无法进行复制!" << endl;
                else
                {
                    cout << "新建一个二叉树S成功!已复制二叉树T的值!" << endl;
                    cout << "新建成的二叉树S按先序输出为:" << endl;
                    PreOrderTraverse(S);
                    cout << endl;
                    cout << "新建成的二叉树S按中序输出为:" << endl;
                    InOrderTraverse(S);
                    cout << endl;
                }
                break;
            case 12:
                L = NULL;
                cout << "--请输入符合二叉树L先序次序的字符串:";
                getchar();
                CreateBiTree(L);
                cout << "创建新的二叉树L成功!二叉树L按照先序输出为:" << endl;
                PreOrderTraverse(L);
                cout << endl;
                cout << "二叉树L按中序输出为:" << endl;
                InOrderTraverse(L);
                cout << endl;
                fine = IsSameTree(T,L);
                if(fine == ERROR) cout << "二叉树T和二叉树L不相等!" << endl;
                else cout << "二叉树T和二叉树L相等!" << endl;
                break;
            case 13:
                cout << "当前二叉树T层次遍历为:" << endl;
                LevelTraverse(T);
                cout << endl;
                break;
            case 0:
                goto END;
            default:
                cout << "无该选项!" << endl;
        }
    }while(ch);
    END:
        cout << "结束当前程序成功!欢迎下次修改!" << endl;
    return 0;
}
//
//Created by somewon on 2022/11/8.
//

4. Operating environment

CLion

Guess you like

Origin blog.csdn.net/somewon/article/details/127767669