二叉树算法总结

关于二叉树,最近被这些搞得头昏脑涨。于是专门写了程序。直接放代码了。

#include<stdlib.h>
#include<stdio.h>

//二叉树结点的描述
typedef struct BiTNode
{
    int data;
    struct BiTNode *lchild, *rchild;      //左右孩子
}BiTNode,*BiTree;

BiTNode* createBiTNode(int data)
{
    BiTNode *tmp;
    tmp=(BiTNode*)malloc(sizeof(BiTNode));
    tmp->data=data;
    tmp->lchild=tmp->rchild=0;
    return tmp;
}

//按先序遍历创建二叉树void
void createBiTree(BiTNode **root)    //二级指针作为函数参数
{
    int data; //要插入的数据
    scanf("%d", &data);
    if(data==0)
        *root = NULL;
    else
    {
        *root = createBiTNode(data);
        printf("请输入%d的左孩子(必须比父节点的数据小 按0跳过输入):",data);
        createBiTree(&((*root)->lchild));
        printf("请输入%d的右孩子(必须比父节点的数据大 按0跳过输入):",data);
        createBiTree(&((*root)->rchild));
    }
}


//前序遍历的算法程序
void preOrder(BiTNode *root)
{
    if(root==NULL)
        return ;
    printf("%d ", root->data); //输出数据
    preOrder(root->lchild); //递归调用,前序遍历左子树
    preOrder(root->rchild); //递归调用,前序遍历右子树
}

//中序遍历的算法程序
void inOrder(BiTNode *root)
{
    if(root==NULL)
        return ;
    inOrder(root->lchild); //递归调用,前序遍历左子树
    printf("%d ", root->data); //输出数据
    inOrder(root->rchild); //递归调用,前序遍历右子树
}

//后序遍历的算法程序
void postOrder(BiTNode *root)
{
    if(root==NULL)
        return ;
    postOrder(root->lchild);      //递归调用,前序遍历左子树
    postOrder(root->rchild);      //递归调用,前序遍历右子树
    printf("%d ", root->data);    //输出数据
}

BiTNode* search_BiTNode(BiTNode *root,int data)
{
    while(root)
    {
        if(data<root->data)
        {
            root=root->lchild;
        }
        else if(data>root->data)
        {
            root=root->rchild;
        }
        else
        {
            return root;
        }
    }
    return NULL;
}

void add_BiTNode(BiTNode *root,int data)
{
    BiTNode *tmp,*p=root;
    while(p)
    {
        if(p->data>data)
        {
            tmp=search_BiTNode(p,p->data);//记录父节点
            p=p->lchild;
        }
        else if(p->data<data)
        {
            tmp=search_BiTNode(p,p->data);//记录父节点
            p=p->rchild;
        }
        else
        {
            printf("已有该数据,不能重复添加!\n");
            return;
        }
    }
    if(tmp->data<data)
    {
        p=createBiTNode(data);
        tmp->rchild=p;
        printf("添加成功!\n");
    }
    else
    {
        p=createBiTNode(data);
        tmp->lchild=p;
        printf("添加成功!\n");
    }
}

void change_BiTNode(BiTNode *root,int data)
{
    BiTNode *T=search_BiTNode(root,data);
    if(!T)
    {
        printf("未找到结点!错误!\n");
        return;
    }
    printf("请输入新数据:");
    scanf("%d",&T->data);
    printf("数据修改成功!\n");
}

void delete_BiTNode(BiTNode *root,int data)
{
    BiTNode *tmp=search_BiTNode(root,data);
    BiTNode *p=root;//记录T的父结点
    if(!tmp)
    {
        printf("未找到结点!错误!\n");
        return;
    }
    while(p)
    {
        if(p->data>data)
        {
            tmp=search_BiTNode(p,p->data);//记录父节点
            p=p->lchild;
        }
        else if(p->data<data)
        {
            tmp=search_BiTNode(p,p->data);//记录父节点
            p=p->rchild;
        }
        else
            break;
    }
    if(!p->lchild&&!p->rchild)//p为叶子结点
    {
        if(tmp->data>p->data)
        {
            tmp->lchild=NULL;//p的父结点指针置零
            free(p);//释放内存
        }
        else
        {
            tmp->rchild=NULL;
            free(p);
        }
    }
    else if(p->lchild&&!p->rchild)//p有左孩子没右孩子
    {
        if(tmp->data>p->data)
        {
            tmp->lchild=p->lchild;
            free(p);//释放内存
        }
        else
        {
            tmp->rchild=p->lchild;
            free(p);
        }
    }
    else if(!p->lchild&&p->rchild)//p有右孩子没有左孩子
    {
        if(tmp->data>p->data)
        {
            tmp->lchild=p->rchild;
            free(p);//释放内存
        }
        else
        {
            tmp->rchild=p->rchild;
            free(p);
        }
    }
    else if(p->lchild&&p->rchild)//两个孩子都有
    {
        /**由于这部分情况很复杂,有机会再做总结**/
        return;
    }
}


int depth(BiTNode *T)   //树的深度
{
    if(T==NULL)
        return 0;
    return (depth(T->lchild)>depth(T->rchild)?depth(T->lchild):depth(T->rchild))+1;
}

int countNode(BiTNode *T)
{
     if(T==NULL)
        return 0;
     return 1+countNode(T->lchild)+countNode(T->rchild);
}

int main()
{
    BiTNode *root=NULL; //定义一个根结点
    int op;
    int data;
    do
    {
        system("cls");
        printf("\t\t本程序实现二叉树的基本操作。\n");
        printf("可以进行建立二叉树,递归先序、中序、后序遍历,增加,删除,修改,搜索等操作。\n");
        printf("\n");
        printf("|--------------------------------------------------------------|\n");
        printf("|                    二叉树的基本操作如下:                     |\n");
        printf("|                        1.创建二叉树                          |\n");
        printf("|                        2.递归先序遍历                        |\n");
        printf("|                        3.递归中序遍历                        |\n");
        printf("|                        4.递归后序遍历                        |\n");
        printf("|                        5.查找二叉树元素                      |\n");
        printf("|                        6.添加二叉树元素                      |\n");
        printf("|                        7.修改二叉树元素                      |\n");
        printf("|                        8.删除二叉树元素                      |\n");
        printf("|                        9.二叉树的深度                        |\n");
        printf("|                        10.二叉树的结点个数                   |\n");
        printf("|                        11.清空二叉树元素                     |\n");
        printf("|                        0.退出程序                            |\n");
        printf("|--------------------------------------------------------------|\n");
        printf("\t\t请选择功能:");
        scanf("%d",&op);
        switch(op)
        {
        case 1:
            system("cls");
            printf("请建立二叉树并输入二叉树的根节点:");
            createBiTree(&root);
            system("pause");
            break;
        case 2:
            system("cls");
            if(root)
            {
                printf("递归先序遍历二叉树的结果为:");
                preOrder(root);
                printf("\n");
            }
            else
                printf("\t二叉树为空!\n");
            system("pause");
            break;
        case 3:
            system("cls");
            if(root)
            {
                printf("递归中序遍历二叉树的结果为:");
                inOrder(root);
                printf("\n");
            }
            else
                printf("\t二叉树为空!\n");
            system("pause");
            break;
        case 4:
            system("cls");
            if(root)
            {
                printf("递归后序遍历二叉树的结果为:");
                postOrder(root);
                printf("\n");
            }
            else
                printf("\t二叉树为空!\n");
            system("pause");
            break;
        case 5:
            {
                system("cls");
                BiTNode *T;
            if(root)
            {
                printf("请输入要查找的数据:");
                scanf("%d",&data);
                T=search_BiTNode(root,data);
                if(T)
                {
                    printf("已找到数据!\n");
                }
                else
                {
                    printf("未能找到数据!\n");
                }
            }
            else
            {
                printf("\t二叉树为空!\n");
            }
            system("pause");
            break;
            }
        case 6:
            system("cls");
            if(root)
            {
                printf("请输入你想要添加的结点数据:");
                scanf("%d",&data);
                add_BiTNode(root,data);
            }
            else
                printf("\t二叉树为空!\n");
            system("pause");
            break;
        case 7:
            system("cls");
            if(root)
            {
                printf("请输入你想要修改的结点数据:");
                scanf("%d",&data);
                change_BiTNode(root,data);
            }
            else
                printf("\t二叉树为空!\n");
            system("pause");
            break;
        case 8:
            {
                system("cls");
                if(root)
                {
                    printf("请输入要删除的元素值:");
                    scanf("%d",&data);
                    delete_BiTNode(root,data);
                }
                else
                    printf("\t二叉树为空!\n");
                system("pause");
                break;
            }
        case 9:
            system("cls");
            if(root)
                printf("这棵二叉树的深度为:%d\n",depth(root));
            else
                printf("\t二叉树为空!\n");
            system("pause");
            break;
        case 10:
            system("cls");
            if(root)
                printf("这棵二叉树的结点个数为:%d\n",countNode(root));
            else
                printf("\t二叉树为空!\n");
            system("pause");
            break;
        case 11:
            system("cls");
            if(root)
            {
                free(root);
                root=NULL;
                printf("清空二叉树成功!\n");
            }
            else
                printf("\t二叉树为空!\n");
            system("pause");
            break;
        default:
            printf("程序运行结束,按任意键退出!\n");
        }
    }while(op);

    if(root)
    {
        free(root);
    }
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值