树与二叉树作业

news2025/1/10 17:04:06

1. 已知一个二叉树的中序遍历序列和后序遍历序列,求这棵树的前序遍历序列

【问题描述】
 已知一个二叉树的中序遍历序列和后序遍历序列,求这棵树的前序遍历序列。

【输入形式】
 一个树的中序遍历序列 该树后序遍历序列,中间用空格分开。输入序列中仅含有小写字母,且没有重复的字母

【输出形式】
 一个树的前序遍历序列

【样例输入】

dbeafcg debfgca

【样例输出】

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

struct TreeNode {
    char data;
    struct TreeNode* left;
    struct TreeNode* right;
};

int search(char in[], int start, int end, char value) {
    for (int i = start; i <= end; i++) {
        if (in[i] == value) {
            return i;
        }
    }
    return -1;
}

struct TreeNode* buildTree(char in[], char post[], int inStart, int inEnd, int* postIndex) {
    if (inStart > inEnd) {
        return NULL;
    }

    struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
    node->data = post[(*postIndex)--];
    node->left = NULL;
    node->right = NULL;

    if (inStart == inEnd) {
        return node;
    }

    int rootIndex = search(in, inStart, inEnd, node->data);

    node->right = buildTree(in, post, rootIndex + 1, inEnd, postIndex);
    node->left = buildTree(in, post, inStart, rootIndex - 1, postIndex);

    return node;
}

void printPreorder(struct TreeNode* root) {
    if (root == NULL) {
        return;
    }
    printf("%c", root->data);
    printPreorder(root->left);
    printPreorder(root->right);
}

int main() {
    char inorder[100], postorder[100];
    scanf("%s %s", inorder, postorder);

    int len = strlen(inorder);
    int postIndex = len - 1;

    struct TreeNode* root = buildTree(inorder, postorder, 0, len - 1, &postIndex);

    printPreorder(root);
    printf("\n");

    return 0;
}

2. 非递归的中序遍历

【问题描述】

给定二叉树,返回它的中序遍历。

要求:使用栈实现,不可使用递归。

【输入形式】

一行,包含用空格分开的n个元素,每个元素为整数或者None(None表示空结点),依次表示按自顶向下层次遍历的二叉树结点。空结点对应的“孩子”(实际上不存在)不再用None表示。

【输出形式】

一行,二叉树的中序遍历,每个值间用空格隔开。

【样例输入】

1 2 3 4 5 6

【样例输出】

4 2 5 1 6 3
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
};

struct Stack {
    struct TreeNode **array;
    int top;
    int capacity;
};

struct Stack *createStack(int capacity) {
    struct Stack *stack = (struct Stack *)malloc(sizeof(struct Stack));
    stack->capacity = capacity;
    stack->top = -1;
    stack->array = (struct TreeNode **)malloc(stack->capacity * sizeof(struct TreeNode *));
    return stack;
}

int isEmpty(struct Stack *stack) {
    return stack->top == -1;
}

int isFull(struct Stack *stack) {
    return stack->top == stack->capacity - 1;
}

void push(struct Stack *stack, struct TreeNode *item) {
    if (isFull(stack)) return;
    stack->array[++stack->top] = item;
}

struct TreeNode *pop(struct Stack *stack) {
    if (isEmpty(stack)) return NULL;
    return stack->array[stack->top--];
}

void inorderTraversal(struct TreeNode *root) {
    if (root == NULL) return;

    struct Stack *stack = createStack(100);
    struct TreeNode *current = root;

    while (current != NULL || !isEmpty(stack)) {
        while (current != NULL) {
            push(stack, current);
            current = current->left;
        }
        current = pop(stack);
        printf("%d ", current->val);
        current = current->right;
    }

    free(stack->array);
    free(stack);
}

struct TreeNode *createTree(char input[][10], int n) {
    if (n == 0) return NULL;

    struct TreeNode **nodes = (struct TreeNode **)malloc(n * sizeof(struct TreeNode *));
    for (int i = 0; i < n; i++) {
        if (strcmp(input[i], "None") == 0) {
            nodes[i] = NULL;
        } else {
            nodes[i] = (struct TreeNode *)malloc(sizeof(struct TreeNode));
            nodes[i]->val = atoi(input[i]);
            nodes[i]->left = nodes[i]->right = NULL;
        }
    }

    for (int i = 0; i < n; i++) {
        if (nodes[i] != NULL) {
            int leftIndex = 2 * i + 1;
            int rightIndex = 2 * i + 2;
            if (leftIndex < n) nodes[i]->left = nodes[leftIndex];
            if (rightIndex < n) nodes[i]->right = nodes[rightIndex];
        }
    }

    struct TreeNode *root = nodes[0];
    free(nodes);
    return root;
}

void freeTree(struct TreeNode *root) {
    if (root == NULL) return;
    freeTree(root->left);
    freeTree(root->right);
    free(root);
}

int main() {
    char input[100][10];
    int n = 0;
    while (scanf("%s", input[n]) != EOF) {
        n++;
    }

    struct TreeNode *root = createTree(input, n);

    inorderTraversal(root);

    freeTree(root);

    return 0;
}

3. 判断完全二叉树

【问题描述】

给定一棵树的前序遍历和中序遍历,判断该树是否为完全二叉树
【输入形式】

一棵树的前序遍历和中序遍历
【输出形式】 

True or False

【样例输入】

2 4 8 10 6 11
8 4 10 2 11 6

【样例输出】

True

【样例说明】

【评分标准】

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

typedef struct Node {
    int data;
    struct Node *left, *right;
} Node;

Node* newNode(int data) {
    Node* node = (Node*)malloc(sizeof(Node));
    node->data = data;
    node->left = node->right = NULL;
    return node;
}

Node* buildTree(int pre[], int in[], int inStrt, int inEnd) {
    static int preIndex = 0;
    if (inStrt > inEnd) return NULL;
    Node* tNode = newNode(pre[preIndex++]);
    if (inStrt == inEnd) return tNode;
    int inIndex;
    for (inIndex = inStrt; inIndex <= inEnd; inIndex++) {
        if (in[inIndex] == tNode->data) break;
    }
    tNode->left = buildTree(pre, in, inStrt, inIndex - 1);
    tNode->right = buildTree(pre, in, inIndex + 1, inEnd);
    return tNode;
}

bool isCompleteBT(Node* root) {
    if (root == NULL) return true;

    bool end = false;
    Node* temp;
    Node* queue[1000]; // Changed to a regular array instead of dynamic allocation
    int front = 0, rear = 0;
    queue[rear++] = root;

    while (front < rear) {
        temp = queue[front++];

        if (temp->left) {
            if (end) return false;
            queue[rear++] = temp->left;
        } else {
            end = true;
        }

        if (temp->right) {
            if (end) return false;
            queue[rear++] = temp->right;
        } else {
            end = true;
        }
    }

    return true;
}

int main() {
    int preorder[100], inorder[100];
    int n = 0;
    char temp;
    while (scanf("%d", &preorder[n])) {
        temp = getchar();
        n++;
        if (temp == '\n') {
            break;
        }
    }
    for (int i = 0; i < n; i++) {
        scanf("%d", &inorder[i]);
    }

    Node* root = buildTree(preorder, inorder, 0, n - 1);
    if (isCompleteBT(root)) 
        printf("True\n");
    else 
        printf("False\n");
    return 0;
}

4. 二叉树遍历

【问题描述】

给定一棵N个节点的二叉树,输出其前序遍历,中序遍历,后序遍历,层次遍历。
【输入形式】

输入共N+1行。

第1行为一个整数N,描述节点个数。

其余N行按顺序描述第1,2,……,N个结点的左右子节点编号,0表示没有相应子节点。
【输出形式】

输出共4行,分别为前序遍历,中序遍历,后序遍历,层次遍历。
【样例输入】

10

8 0

4 1

0 0

6 9

0 0

3 7

0 0

0 0

5 10

0 0


【样例输出】

2 4 6 3 7 9 5 10 1 8 

3 6 7 4 5 9 10 2 8 1 

3 7 6 5 10 9 4 8 1 2 

2 4 1 6 9 8 3 7 5 10 


【数据范围】

保证输入的是合法的二叉树。

1<= N <= 10000.

#include <iostream>
#include <vector>
#include <queue>

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

TreeNode* build_tree(const std::vector<std::pair<int, int>>& nodes) {
    std::vector<TreeNode*> tree_nodes(nodes.size() + 1);
    std::vector<bool> is_root(nodes.size() + 1, true);
    for (int i = 1; i <= nodes.size(); ++i) {
        tree_nodes[i] = new TreeNode(i);
    }
    for (int i = 1; i <= nodes.size(); ++i) {
        tree_nodes[i]->left = nodes[i - 1].first ? tree_nodes[nodes[i - 1].first] : nullptr;
        tree_nodes[i]->right = nodes[i - 1].second ? tree_nodes[nodes[i - 1].second] : nullptr;
        if (nodes[i - 1].first) is_root[nodes[i - 1].first] = false;
        if (nodes[i - 1].second) is_root[nodes[i - 1].second] = false;
    }
    for (int i = 1; i <= nodes.size(); ++i) {
        if (is_root[i]) return tree_nodes[i];
    }
    return nullptr;
}


void preorder_traversal(TreeNode* root, std::vector<int>& result) {
    if (!root) return;
    result.push_back(root->val);
    preorder_traversal(root->left, result);
    preorder_traversal(root->right, result);
}

void inorder_traversal(TreeNode* root, std::vector<int>& result) {
    if (!root) return;
    inorder_traversal(root->left, result);
    result.push_back(root->val);
    inorder_traversal(root->right, result);
}

void postorder_traversal(TreeNode* root, std::vector<int>& result) {
    if (!root) return;
    postorder_traversal(root->left, result);
    postorder_traversal(root->right, result);
    result.push_back(root->val);
}

std::vector<int> level_order_traversal(TreeNode* root) {
    std::vector<int> result;
    std::queue<TreeNode*> q;
    if (root) q.push(root);
    while (!q.empty()) {
        TreeNode* node = q.front();
        q.pop();
        result.push_back(node->val);
        if (node->left) q.push(node->left);
        if (node->right) q.push(node->right);
    }
    return result;
}

int main() {
    int N;
    std::cin >> N;
    std::vector<std::pair<int, int>> nodes(N);
    for (int i = 0; i < N; ++i) {
        std::cin >> nodes[i].first >> nodes[i].second;
    }

    TreeNode* root = build_tree(nodes);

    std::vector<int> preorder, inorder, postorder, level_order;
    preorder_traversal(root, preorder);
    inorder_traversal(root, inorder);
    postorder_traversal(root, postorder);
    level_order = level_order_traversal(root);

    for (int val : preorder) std::cout << val << ' ';
    std::cout << '\n';
    for (int val : inorder) std::cout << val << ' ';
    std::cout << '\n';
    for (int val : postorder) std::cout << val << ' ';
    std::cout << '\n';
    for (int val : level_order) std::cout << val << ' ';
    std::cout << '\n';

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1201522.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pta 高空坠球 Python3

皮球从某给定高度自由落下&#xff0c;触地后反弹到原高度的一半&#xff0c;再落下&#xff0c;再反弹&#xff0c;……&#xff0c;如此反复。问皮球在第n次落地时&#xff0c;在空中一共经过多少距离&#xff1f;第n次反弹的高度是多少&#xff1f; 输入格式: 输入在一行中…

c语言-数据结构-栈和队列的实现和解析

目录 一、栈 1、栈的概念 1.2 栈的结构 2、栈的创建及初始化 3、压栈操作 4、出栈操作 5、显示栈顶元素 6、显示栈空间内元素的总个数 7、释放栈空间 8、测试栈 二、队列 1、队列的概念 1.2 队列的结构 2、队列的创建及初始化 3、入队 4、出队 5、显示队头、队…

matlab背景部分最小化算法人脸检测

1、内容简介 略 18-可以交流、咨询、答疑 matlab背景部分最小化算法人脸检测 2、内容说明 matlab人脸检测 matlab人脸检测&#xff0c;背景部分最小化算法 3、仿真分析 略. 4、参考论文 略 链接&#xff1a;https://pan.baidu.com/s/1yQ1yDfk-_Qnq7tGpa23L7g 提取码&…

CCLink转Modbus TCP网关_CCLINK参数配置

CCLink转Modbus TCP网关&#xff08;XD-ETHCL20&#xff09;&#xff0c;具有CCLINK主从站功能。主要用途是将各种MODBUS-TCP设备接入到CCLINK总线中。它可以作为从站连接到CCLINK总线上&#xff0c;也可以作为主站或从站连接到MODBUS-MTP总线上。 1、 配置网关的CCLINK参数&am…

kr 第三阶段(九)64 位逆向

X64 汇编程序 64 位与 32 位的区别 更大的内存 64 位 CPU 与 32 位 CPU 的区别 引脚根数&#xff1a; x86 程序&#xff1a;20 根x64 程序&#xff1a;52 根&#xff0c;实际寻址的有 48 根&#xff0c;所以最大内存是 0~256T 寻址区间&#xff1a; x86 程序&#xff1a;0x0…

触摸屏【威纶通】

威纶通&#xff1a; cMT-FHDX-920编程软件&#xff1a; EBproV6.08.02.500_20230828 新建工程&#xff1a; 文件》新建 常用》系统参数 新增设备服务 编程&#xff1a; 目录树》11》新增常用》元件 按钮 标签&#xff1a; 文本信息

MySQL主从环境搭建

MySQL主从环境搭建 主机MySQL配置 修改主机配置文件 vim /etc/my.cnf主要是在my.cnf配置文件中增加以下内容&#xff1a; #主服务器唯一ID server-id1 #启用二进制日志 log-binmysql-bin # 设置不要复制的数据库(可设置多个) binlog-ignore-dbmysql binlog-ignore-dbinform…

【Python】二维码和条形码的识别

我主要的问题就在于无法识别图片 注意事项&#xff1a; 1、从文件中加载图像的时候注意图片尽量用英文来命名&#xff0c;因为中文无法识别到图片 2、使用绝对地址的时候要用两个双斜杠&#xff0c;因为用一个会被识别为Unicode 转义&#xff0c;但是并没有后续的合法 Unico…

联邦学习研究综述笔记

联邦学习 联邦学习的定义&#xff1a;联邦学习是一种分布式机器学习架构&#xff0c;包含多个客户端&#xff08;参与者&#xff09;和一个聚合服务器。客服端&#xff08;参与方&#xff09;&#xff1a;在本地使用自己的私有数据训练模型&#xff0c;训练完成之后将模型的参…

外中断的应用

前言 软件基础操作参考这篇博客&#xff1a; LED数码管的静态显示与动态显示&#xff08;KeilProteus&#xff09;-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/134101256?spm1001.2014.3001.5501实验一&#xff1a;P1口上接8个LED灯&#xff0c;在外部…

人机交互复习专题

第一章概述 1.1人机交互的概念与理解 人机交互的概念与理解 人机交互是人与机器进行交互的操作方式&#xff0c;即用户与机器互相传递信息的媒介。好的人机交互界面美观且通俗易懂、操作简单有引导功能&#xff0c;使用户感受到愉快、有兴趣&#xff0c;从而提升使用效率。 美…

使用Nodejs搭建简单的Web网页并实现公网访问

目录 前言 1. 安装Node.js环境 2. 创建Node.js应用 3. 安装Cpolar内网穿透实现公网访问Nodejs服务 3.1 注册cpolar账号 3.2 下载cpolar客户端 3.3 创建隧道映射本地端口 4. 固定公网远程地址 前言 Node.js是建立在谷歌Chrome的JavaScript引擎(V8引擎)的Web应用程序框架…

单链表(6)

删除第一个val的值&#xff08;考试重点&#xff09; 思路&#xff1a;例如删除val值为3的数据&#xff0c;直接让数据2的p->next指向数据4就可以了。 所以删除必须依赖前驱。也就是要写删除函数&#xff0c;则先要完成返回key的前驱地址的函数 也就是先知道前驱地址&#…

代码随想录第五十一天 | 动态规划 买卖股票:含冷冻期 的多状态 买卖股票问题(309);包含手续费 的买卖股票问题(贪心,动态规划)(714)

1、含冷冻期 的多状态 买卖股票问题 1.1 leetcode 309&#xff1a;最佳买卖股票时机含冷冻期 第一遍代码 运用之前二维dp数组的方法&#xff0c;第二个维度大小为2&#xff0c;对应持有&#xff0c;不持有 dp[1][0] max(dp[0][0], -prices[1]);注意要考虑只有一天的情况 dp[…

Python---字典的增、删、改、查操作

字典的增操作 基本语法&#xff1a; 字典名称[key] value 注&#xff1a;如果key存在则修改这个key对应的值&#xff1b;如果key不存在则新增此键值对。 案例&#xff1a;定义一个空字典&#xff0c;然后添加name、age以及address这样的3个key # 1、定义一个空字典 person {…

阿里云国际站:密钥管理服务

文章目录 一、密钥管理服务的概念 二、密钥管理服务的功能 三、密钥管理服务的优势 一、密钥管理服务的概念 密钥管理服务KMS&#xff08;Key Management Service&#xff09;是您的一站式密钥管理和数据加密服务平台、一站式凭据安全管理平台&#xff0c;提供简单、可靠、…

creo之混合和扫描混合

案例一&#xff1a;杯子 步骤&#xff1a; 在top平面画一个草图圆角矩形&#xff1a; 然后形状–》混合 然后绘制新增的截面2&#xff1a; 用中心线将圆分割成八分&#xff0c;因为底部的圆角矩形是八份线段组成&#xff0c;所以我们要和他一样分成八份&#xff1a;先画中心线…

深入理解对象存储(OSD)

对象存储 1、对象存储的起源2、什么是对象存储3、对象存储与块存储、文件存储4、对象存储架构4.1、对象&#xff08;Object&#xff09;4.2、对象存储设备&#xff08;OSD&#xff09;4.3、元数据服务器&#xff08;MDS&#xff09;4.4、对象存储系统的客户端&#xff08;Clien…

链表的逆置

方法1&#xff1a; 依次将指针反向&#xff0c;最后令头指针指向尾元素。 逆置过程如下&#xff1a; 当q指针为空时&#xff0c;循环结束。 //试写一算法&#xff0c;对单链表实现就地逆置&#xff0c; void Reverse1(List plist)//太复杂,不用掌握 {assert(plist ! NULL);i…

【计算机网络笔记】IP编址与有类IP地址

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…