树与二叉树作业

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.mfbz.cn/a/135537.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

el-table实现展开当前行时收起上一行的功能

<el-tableref"tableRef":data"tableData":expand-row-keys"expandRowKeys":row-key"handleRowKey" // 必须指定 row-keyexpand-change"handleExpandChange" // 当用户对某一行展开或者关闭的时候会触发该事件> <…

Creo螺旋扫描/弹簧画法

一&#xff1a;点击螺旋扫描 二&#xff1a;参考–》螺旋轮廓的定义&#xff1a; 三、草绘轮廓线&#xff1a;视图放正 四、草绘弹簧丝线形状&#xff1a; 在非中轴线上画圆&#xff1a; 制螺旋线&#xff1a; 首先理清Creo绘制螺旋线的逻辑&#xff08;不同于UG直接给定直径…

华为ensp:边缘端口并启动BUDU保护

如上图前提是三个交换机都做了rstp&#xff0c;则在边缘的地方做 边缘端口并启动BUDU保护&#xff0c;也就是我用绿色圈出来的地方 边缘1 进入交换机的系统视图 interface e0/0/3 进入接口 stp edged-port enable quit 再退回系统视图 stp bpdu-protection 这样就可以了…

Arduino ESP8266使用AliyunIoTSDK.h连接阿里云物联网平台

文章目录 1、AliyunIoTSDK简介2、相关库安装3、阿里云创建产品&#xff0c;订阅发布4、对开源的Arduino ESP8266源代码修改5、使用阿里云点亮一个LED灯6、设备向阿里云上传温度数据7、项目源码 1、AliyunIoTSDK简介 AliyunIoTSDK是arduino的一个库&#xff0c;可以在arduino的…

20分钟搭建Ubertooth One开源蓝牙测试工具

kali linux 2023 安装依赖&#xff08;记得使用root用户搭建环境&#xff09; 1、apt-get update 2、apt install ubertooth 更新共享库缓存 3、ldconfig 安装 Ubertooth 工具和驱动程序 4、插入Ubertooth One工具 5、ubertooth-util -v 备注&#xff1a;出现Firmwate v…

Android系统开发快速寻找代码(如何在文件夹中寻找代码)

很多时候对于Android系统开发小白而言&#xff0c;例如预置APK&#xff0c;知道了APK包名不知道具体代码位置需要去寻找代码&#xff0c;但是Android系统代码十分庞大&#xff0c;如何快速准确查询代码是个问题。 本人目前只探索到了一些方法&#xff0c;如有更有效的办法可以…

CMOS介绍

1 二极管 2 CMOS 2.1 栅极、源极、漏极 2.2 内部结构 2.2 导电原理 - 原理&#xff1a;1.通过门级和衬底加一个垂直电场Ev&#xff0c;从而在两口井之间形成反形层2.如果加的电场足够强&#xff0c;反形层就可以把source&#xff08;源极&#xff09;和drain&#xff08;漏极…

UML软件建模软件StarUML mac中文版软件介绍

StarUML for mac是一款UML建模器&#xff0c;StarUML for mac提供了几个模版&#xff0c;帮助用户建立使用新的图表&#xff0c;是目前最流行的UML建模工具&#xff0c;给开发工作带来大大的便利。 StarUML mac软件介绍 StarUML 是一个流行的软件建模工具&#xff0c;用于创建…

【车载开发系列】AutoSar中的CANTP

【车载开发系列】AutoSar中的CANTP 【车载开发系列】AutoSar中的CANTP 【车载开发系列】AutoSar中的CANTP一. CANTP相关术语二. CANTP相关概念1&#xff09;单帧&#xff1a;SF(Single Frame)2&#xff09;首帧&#xff1a;FF(First Frame)3&#xff09;连续帧CF(Consecutive F…

原生微信小程序学习之旅(一) -来简单的使用

文章目录 取消导航栏标头组件创建添加Component组件接收传入的数据 页面创建(Page)关于tabBartabBar自定义样式 轮播图轮播图指示点样式改变 微信小程序快速获取用户信息路由跳转获取url路径中的参数 bindtap(click)传参wx:if编写用户登陆关于默认工程目前的获取方法尝试一下服…

python 中用opencv开发虚拟键盘------可以只选择一个单词不会出现一下选择多个

一. 介绍 OpenCV是最流行的计算机视觉任务库&#xff0c;它是用于机器学习、图像处理等的跨平台开源库&#xff0c;用于开发实时计算机视觉应用程序。 CVzone 是一个计算机视觉包&#xff0c;它使用 OpenCV 和 Media Pipe 库作为其核心&#xff0c;使我们易于运行&#xff0c…

Apache和Nginx实现虚拟主机的3种方式

目录 首先介绍一下Apache和nginx&#xff1a; Nginx和Apache的不同之处&#xff1a; 虚拟主机 准备工作 Apache实现&#xff1a; 方法1&#xff1a;使用不同的ip来实现 方法2&#xff1a;使用相同的ip&#xff0c;不同的端口来实现 方法3&#xff1a;使用相同的ip&…

解决游戏找不到x3daudio1_7.dll文件的5个方法,快速修复dll问题

在电脑使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“x3daudio1_7.dll丢失”。这个错误通常会导致软件游戏无法正常启动运行。为了解决这个问题&#xff0c;我们需要采取一些措施来修复丢失的文件。本文将详细介绍解决x3daudio1_7.dll丢失的方法…

企业云盘与个人云盘:区别与特点一览

企业云盘是企业在寻找文件协同工具的过程中绕不开的一个选项。企业为什么需要专门购置企业网盘&#xff0c;个人云盘能否满足企业的文件协作需求呢&#xff1f;企业云盘和个人云盘有什么区别呢&#xff1f; 企业云盘与个人云盘的区别 1、使用对象&#xff1a;顾名思义&#xf…

Java 简单实现一个 TCP 回显服务器

文章目录 TCP 服务端TCP 客户端实现效果TCP 服务端(实现字典功能)总结 TCP 服务端 package network;import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Soc…

【C++】C++入门详解 II【深入浅出 C++入门 这一篇文章就够了】

C入门 七、引用&#xff08;一&#xff09;引用 概念&#xff08;1&#xff09;引用 概念&#xff08;2&#xff09;引用 使用★☆&#xff08;3&#xff09;引用 特性&#xff08;4&#xff09;常引用 &#xff08;二&#xff09;引用的 实际应用 及 其意义☆&#xff08;1&am…

合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(一)

基于ARM语音识别的智能家居系统 我们接下来带大家完成基于语音识别的智能家居系统嵌入式项目实战&#xff0c;使用到stm32开发板&#xff0c;讯飞的离线语音识别&#xff0c;我们在此之前&#xff0c;我们先学习一些Linux系统的基本操作。 。 一、Linux简介 在嵌入式开发中&am…

matlab 二自由度操纵稳定性汽车模型

1、内容简介 略 19-可以交流、咨询、答疑 二自由度操纵稳定性汽车模型 二自由度、操纵稳定性、操纵动力学 2、内容说明 1 模型假设 忽略转向系的影响&#xff0c;以前、后轮转角作为输入&#xff1b;汽车只进行平行于地面的平面运动&#xff0c;而忽略悬架的作用&#xf…

从虚拟机下载开始的kubeSphere安装

目录 一、虚拟机安装 二、镜像下载安装 1、镜像下载 2、虚拟机创建 3、虚拟机系统安装 三、虚拟机配置 1、IP固定 2、配置yum阿里源 3、关闭防火墙 4、 关闭selinux 5、 禁止swap交换 6、内核参数修改 7、设置kubernetes源 四、docker安装 五、虚拟机分组 六、…

华为ensp:开启rstp修改根网桥

开启rstp 首先去三台交换机上进入系统视图分别开启rstp模式 stp mode rstp 三台交换机上都执行这个命令&#xff0c;就开启rstp模式了 修改根网桥 现在进入要被修改的交换机的系统视图 stp priority 4096 这里我们修改只要比别的交换机数值小就可以&#xff0c;最小的就是…
最新文章