丸砸砸 2023-06-15 15:14 采纳率: 0%
浏览 14

二叉链存储结构存储二叉树

采用二叉链存储结构存储二叉树,假设一棵二叉树的前序序列为2 3 4 5 6 7 9,中序序列为5 3 2 4 7 6 9,根据要求完成相应的操作。
1、根据前序和中序,建立该二叉树。
2、输出该二叉树。
3、输出后序序列。
4、计算二叉树的结点个数。
5、计算所有叶子结点个数

  • 写回答

2条回答 默认 最新

  • 韩楚风 数据库领域优质创作者 2023-06-23 11:18
    关注
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct TreeNode {
        int data;
        struct TreeNode *left;
        struct TreeNode *right;
    } TreeNode;
    
    // 根据前序和中序,建立二叉树
    TreeNode* CreateTree(int* preorder, int* inorder, int preStart, int preEnd, int inStart, int inEnd) {
        if (preStart > preEnd) {
            return NULL;
        }
        TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
        root->data = preorder[preStart];
        int rootIndex = inStart;
        while (inorder[rootIndex] != root->data) {
            rootIndex++;
        }
        int leftSize = rootIndex - inStart;
        root->left = CreateTree(preorder, inorder, preStart + 1, preStart + leftSize, inStart, rootIndex - 1);
        root->right = CreateTree(preorder, inorder, preStart + leftSize + 1, preEnd, rootIndex + 1, inEnd);
        return root;
    }
    
    // 输出二叉树
    void printTree(TreeNode* root, int depth) {
        if (root == NULL) {
            return;
        }
        printTree(root->right, depth + 1);
        for (int i = 0; i < depth; i++) {
            printf("    ");
        }
        printf("%d\n", root->data);
        printTree(root->left, depth + 1);
    }
    
    // 输出后序序列
    void postorderTraversal(TreeNode* root) {
        if (root == NULL) {
            return;
        }
        postorderTraversal(root->left);
        postorderTraversal(root->right);
        printf("%d ", root->data);
    }
    
    // 计算二叉树的结点个数
    int countNodes(TreeNode* root) {
        if (root == NULL) {
            return 0;
        }
        return 1 + countNodes(root->left) + countNodes(root->right);
    }
    
    // 计算所有叶子结点个数
    int countLeaves(TreeNode* root) {
        if (root == NULL) {
            return 0;
        }
        if (root->left == NULL && root->right == NULL) {
            return 1;
        }
        return countLeaves(root->left) + countLeaves(root->right);
    }
    
    int main() {
        int preorder[] = {2, 3, 4, 5, 6, 7, 9};
        int inorder[] = {5, 3, 2, 4, 7, 6, 9};
        TreeNode* root = CreateTree(preorder, inorder, 0, 6, 0, 6);
        printf("二叉树:\n");
        printTree(root, 0);
        printf("后序序列:");
        postorderTraversal(root);
        printf("\n结点个数:%d\n", countNodes(root));
        printf("叶子结点个数:%d\n", countLeaves(root));
        return 0;
    }
    
    评论

报告相同问题?

问题事件

  • 创建了问题 6月15日

悬赏问题

  • ¥15 机器学习预测遇到的目标函数问题
  • ¥15 python的EOFError该怎么解决?
  • ¥15 Fluent,液体进入旋转区域体积分数不连续
  • ¥15 java linux下将docx文件转pdf
  • ¥15 maven无法下载依赖包
  • ¥15 关于pycharm, Callable[[str],bool]作为方法参数使用时, lambda 类型不提示问题
  • ¥15 layui数据重载无效
  • ¥15 寻找了解qq家园纵横四海的程序猿。
  • ¥15 optisystem
  • ¥15 VB.NET画图时的撤销编程