蓝海纸 2022-11-14 16:16 采纳率: 100%
浏览 62
已结题

C语言实现二叉树相关操作

A、编写二叉树的创建函数,可以是排序二叉树的创建思路(见教材),或者以先序遍历为框架;
B、编写中序遍历函数;
C、编写先序遍历函数;
D、编写后序遍历函数;
E、编写排序二叉树的插入操作函数,实现在二叉排序树插入一个新元素;
F、编写函数求二叉树的深度。
编写主函数main,依次完成:创建一颗二叉树 (调用中序遍历函数,输出遍历结果 (调用先序遍历函数,输出遍历结果 (调用后序遍历函数,输出遍历结果 (调用排序二叉树插入函数,插入一个新元素 (再次调用中序遍历函数,输出插入新元素后的遍历结果 (调用求二叉树深度的函数,输出二叉树深度。

  • 写回答

2条回答 默认 最新

  • 游一游走一走 2022-11-14 16:23
    关注
    #include <stdlib.h>
    #include <stdio.h>
    
    typedef struct node
    { //树的结点
        int data;
        struct node *left;
        struct node *right;
    } Node;
    
    typedef struct
    { //树根
        Node *root;
    } Tree;
    
    void insert(Tree *tree, int value) //创建树
    {
        Node *node = (Node *)malloc(sizeof(Node)); //创建一个节点
        node->data = value;
        node->left = NULL;
        node->right = NULL;
        if (tree->root == NULL) //判断树是不是空树
        {
            tree->root = node;
        }
        else
        {                            //不是空树
            Node *temp = tree->root; //从树根开始
            while (temp != NULL)
            {
    
                if (value < temp->data) //小于就进左儿子
                {
                    if (temp->left == NULL)
                    {
                        temp->left = node;
                        return;
                    }
                    else
                    { //继续判断
                        temp = temp->left;
                    }
                }
                else
                { //否则进右儿子
    
                    if (temp->right == NULL)
                    {
                        temp->right = node;
                        return;
                    }
                    else
                    { //继续判断
                        temp = temp->right;
                    }
                }
            }
        }
        return;
    }
    
    //前序遍历
    void preOrederTraverse(Node *node)
    {
        if (node != NULL)
        {
            printf("%d ", node->data);
            preOrederTraverse(node->left);
            preOrederTraverse(node->right);
        }
    }
    
    void inorder(Node *node) //树的中序遍历
    {
        if (node != NULL)
        {
            inorder(node->left);
            printf("%d ", node->data);
            inorder(node->right);
        }
    }
    
    //后序遍历
    void postOrderTraverse(Node *node)
    {
        if (node != NULL)
        {
            postOrderTraverse(node->left);
            postOrderTraverse(node->right);
            printf("%d ", node->data);
        }
    }
    int getDepth(Node *node)
    {
        int deep = 0; //深度计数
        if (node != NULL)
        {                                                                //如果当前结点不为空
            int leftdeep = getDepth(node->left);                         //则先判断其左子树的深度
            int rightdeep = getDepth(node->right);                       //然后判断右子树的深度
            deep = leftdeep >= rightdeep ? leftdeep + 1 : rightdeep + 1; //二叉树的深度对应左右子树中最大的一个 再加上当前的深度1
        }
        return deep; //将深度值返回
    }
    
    int main()
    {
        Tree tree;
        tree.root = NULL; //创建一个空树
        int n;
        scanf("%d", &n);
        for (int i = 0; i < n; i++) //输入n个数并创建这个树
        {
            int temp;
            scanf("%d", &temp);
            insert(&tree, temp);
        }
        inorder(tree.root); //中序遍历
        printf("\n");
        preOrederTraverse(tree.root); //前序遍历
        printf("\n");
        postOrderTraverse(tree.root); //后序遍历
        printf("\n");
        insert(&tree, 10);
        inorder(tree.root); //中序遍历
        printf("\n");
        preOrederTraverse(tree.root); //前序遍历
        printf("\n");
        postOrderTraverse(tree.root); //后序遍历
        printf("\n");
        printf("%d", getDepth(tree.root));
        getchar();
        getchar();
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月19日
  • 已采纳回答 11月14日
  • 创建了问题 11月14日

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况