蓝海纸 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日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度