十早月. 2024-01-03 14:35 采纳率: 16.7%
浏览 4
已结题

数据结构 二叉树的创建使用c语言实现图中工能并且能打印出二叉树的形状,图中功能都实现

img


数据结构题,实现途中要求的功能并打印出其二叉树
创建建立二叉树并打印出,然后统计计算叶子结点数,交换左右节点,几点二叉树的最大宽度,

  • 写回答

2条回答 默认 最新

  • writeBig 2024-01-03 14:37
    关注
    #include <iostream>
    #include <queue>
    #include <stack>
    #include <vector>
    
    struct TreeNode {
        int val;
        TreeNode* left;
        TreeNode* right;
        TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    };
    
    // 建立二叉树
    TreeNode* buildBinaryTree() {
        std::cout << "请输入二叉树的元素(-1表示空节点):" << std::endl;
    
        int val;
        std::cin >> val;
    
        if (val == -1) {
            return nullptr;
        }
    
        TreeNode* root = new TreeNode(val);
        root->left = buildBinaryTree();
        root->right = buildBinaryTree();
    
        return root;
    }
    
    // 统计二叉树的叶子节点个数
    int countLeafNodes(TreeNode* root) {
        if (root == nullptr) {
            return 0;
        }
    
        if (root->left == nullptr && root->right == nullptr) {
            return 1;
        }
    
        return countLeafNodes(root->left) + countLeafNodes(root->right);
    }
    
    // 交换二叉树的每个节点的左孩子与右孩子
    void swapChildren(TreeNode* root) {
        if (root == nullptr) {
            return;
        }
    
        TreeNode* temp = root->left;
        root->left = root->right;
        root->right = temp;
    
        swapChildren(root->left);
        swapChildren(root->right);
    }
    
    // 计算二叉树的最大宽度
    int maxWidth(TreeNode* root) {
        if (root == nullptr) {
            return 0;
        }
    
        int maxW = 0;
        std::queue<TreeNode*> q;
        q.push(root);
    
        while (!q.empty()) {
            int levelSize = q.size();
            maxW = std::max(maxW, levelSize);
    
            for (int i = 0; i < levelSize; i++) {
                TreeNode* node = q.front();
                q.pop();
    
                if (node->left) {
                    q.push(node->left);
                }
                if (node->right) {
                    q.push(node->right);
                }
            }
        }
    
        return maxW;
    }
    
    // 求任意二叉树中第一条最长路径,并输出此路径
    std::vector<int> longestPath(TreeNode* root) {
        std::vector<int> path;
        std::vector<int> longest;
    
        findLongestPath(root, path, longest);
    
        return longest;
    }
    
    void findLongestPath(TreeNode* root, std::vector<int>& path, std::vector<int>& longest) {
        if (root == nullptr) {
            return;
        }
    
        path.push_back(root->val);
    
        if (root->left == nullptr && root->right == nullptr) {
            if (path.size() > longest.size()) {
                longest = path;
            }
        }
    
        findLongestPath(root->left, path, longest);
        findLongestPath(root->right, path, longest);
    
        path.pop_back();
    }
    
    // 输出二叉树中每个叶子节点到根节点的路径
    void printPathsToLeaves(TreeNode* root) {
        std::vector<int> path;
        printPathsToLeavesHelper(root, path);
    }
    
    void printPathsToLeavesHelper(TreeNode* root, std::vector<int>& path) {
        if (root == nullptr) {
            return;
        }
    
        path.push_back(root->val);
    
        if (root->left == nullptr && root->right == nullptr) {
            std::cout << "路径:";
            for (int i = path.size() - 1; i >= 0; i--) {
                std::cout << path[i] << " ";
            }
            std::cout << std::endl;
        }
    
        printPathsToLeavesHelper(root->left, path);
        printPathsToLeavesHelper(root->right, path);
    
        path.pop_back();
    }
    
    // 测试函数
    int main() {
        TreeNode* root = buildBinaryTree();
    
        std::cout << "叶子节点个数:" << countLeafNodes(root) << std::endl;
    
        swapChildren(root);
        std::cout << "交换左右孩子后的二叉树:" << std::endl;
        // 输出二叉树的代码略去,您可以根据需要添加相应的输出函数
    
        std::cout << "最大宽度:" << maxWidth(root) << std::endl;
    
        std::vector<int> longestPath = longestPath(root);
        std::cout << "最长路径:";
        for (int i = 0; i < longestPath.size(); i++) {
            std::cout << longestPath[i] << " ";
        }
        std::cout << std::endl;
    
        std::cout << "叶子节点到根节点的路径:" << std::endl;
        printPathsToLeaves(root);
    
        return 0;
    }
    
    
    

    如有用,请采纳

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月26日
  • 创建了问题 1月3日

悬赏问题

  • ¥15 求一份STM32F10X的I2S外设库
  • ¥15 android 打包报错
  • ¥15 关于stm32的问题
  • ¥15 ncode振动疲劳分析中,noisefloor如何影响PSD函数?
  • ¥50 寻找fpga的benchmark
  • ¥50 如何在arduino上,实现用4×4矩阵键盘按键控制2004显示屏输出图中显示功能的代码?
  • ¥15 P1口接8个发光二极管,利用定时计数器1编写程序
  • ¥20 keil5编译找不到.h文件该如何解决
  • ¥15 安卓EVS如何开启服务正常实现功能
  • ¥15 canal读取mysql时报错