2.17学习总结

已知二叉树中序,后序 求先序

复制代码
#include <stdio.h>
#include <string.h>

// 根据中序和后序遍历求先序遍历
void getPreorder(char inorder[], char postorder[], int inStart, int inEnd, int postStart, int postEnd) {
    if (inStart > inEnd || postStart > postEnd) {
        return;
    }
    // 后序遍历的最后一个元素是根节点
    char root = postorder[postEnd];
    printf("%c", root);

    // 在中序遍历中找到根节点的位置
    int rootIndex;
    for (rootIndex = inStart; rootIndex <= inEnd; rootIndex++) {
        if (inorder[rootIndex] == root) {
            break;
        }
    }

    // 计算左子树的节点数量
    int leftSubtreeSize = rootIndex - inStart;

    // 递归处理左子树
    getPreorder(inorder, postorder, inStart, rootIndex - 1, postStart, postStart + leftSubtreeSize - 1);
    // 递归处理右子树
    getPreorder(inorder, postorder, rootIndex + 1, inEnd, postStart + leftSubtreeSize, postEnd - 1);
}

int main() {
    char inorder[10], postorder[10];
    // 读取中序和后序遍历的字符串
    scanf("%s", inorder);
    scanf("%s", postorder);

    int len = strlen(inorder);
    // 调用函数求先序遍历
    getPreorder(inorder, postorder, 0, len - 1, 0, len - 1);
    printf("\n");

    return 0;
}

已知二叉树中序,先序求后序

复制代码
#include <stdio.h>
#include <string.h>

#define MAXN 30

// 根据前序和中序遍历输出后序遍历结果
void getPostorder(char* inorder, char* preorder, int inStart, int inEnd, int* preIndex) {
    if (inStart > inEnd) return;

    // 从前序遍历中取出当前根节点
    char root = preorder[*preIndex];
    (*preIndex)++;

    // 在中序遍历中找到根节点的位置
    int inIndex;
    for (inIndex = inStart; inIndex <= inEnd; inIndex++) {
        if (inorder[inIndex] == root) break;
    }

    // 递归处理左子树
    getPostorder(inorder, preorder, inStart, inIndex - 1, preIndex);
    // 递归处理右子树
    getPostorder(inorder, preorder, inIndex + 1, inEnd, preIndex);
    // 输出根节点
    printf("%c", root);
}

int main() {
    char inorder[MAXN], preorder[MAXN];
    scanf("%s", inorder);
    scanf("%s", preorder);

    int len = strlen(inorder);
    int preIndex = 0;

    // 调用函数获取后序遍历结果
    getPostorder(inorder, preorder, 0, len - 1, &preIndex);

    return 0;
}
复制代码
#include <stdio.h>
#include <stdlib.h>

#define MAX_N 100005

// 定义邻接表节点结构
typedef struct Node {
    int vertex;
    struct Node* next;
} Node;

// 定义队列节点结构
typedef struct QueueNode {
    int vertex;
    int distance;
} QueueNode;

// 全局变量
Node* adj[MAX_N];
int distance[MAX_N];
int visited[MAX_N];
int n, d;

// 创建新的邻接表节点
Node* createNode(int v) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->vertex = v;
    newNode->next = NULL;
    return newNode;
}

// 添加边到邻接表
void addEdge(int u, int v) {
    Node* newNode = createNode(v);
    newNode->next = adj[u];
    adj[u] = newNode;

    newNode = createNode(u);
    newNode->next = adj[v];
    adj[v] = newNode;
}

// 广度优先搜索
void bfs() {
    QueueNode queue[MAX_N];
    int front = 0, rear = 0;

    // 初始化起点
    queue[rear].vertex = 1;
    queue[rear].distance = 0;
    rear++;
    visited[1] = 1;
    distance[1] = 0;

    while (front < rear) {
        QueueNode current = queue[front++];
        int u = current.vertex;
        int dist = current.distance;

        Node* temp = adj[u];
        while (temp != NULL) {
            int v = temp->vertex;
            if (!visited[v]) {
                visited[v] = 1;
                distance[v] = dist + 1;
                queue[rear].vertex = v;
                queue[rear].distance = dist + 1;
                rear++;
            }
            temp = temp->next;
        }
    }
}

int main() {
    // 读取输入
    scanf("%d %d", &n, &d);

    // 初始化邻接表、距离数组和访问标记数组
    for (int i = 1; i <= n; i++) {
        adj[i] = NULL;
        distance[i] = -1;
        visited[i] = 0;
    }

    // 构建图
    for (int i = 0; i < n - 1; i++) {
        int u, v;
        scanf("%d %d", &u, &v);
        addEdge(u, v);
    }

    // 进行广度优先搜索
    bfs();

    // 统计距离不超过 d 的小企鹅数量
    int count = 0;
    for (int i = 2; i <= n; i++) {
        if (distance[i] != -1 && distance[i] <= d) {
            count++;
        }
    }

    // 输出结果
    printf("%d\n", count);

    return 0;
}
相关推荐
05664631 分钟前
agent学习——流式响应与文本切分
网络·python·学习
for_ever_love__1 小时前
python基础语法学习: 面向对象的三大特性
开发语言·python·学习
Canmag 兴隆磁性3 小时前
C 系列充磁机
c语言·开发语言·学习·永磁材料·充磁·退磁
PC2005-cloud4 小时前
Go学习笔记:基本概念与项目结构——GOPATH、Go Modules 与常用命令
笔记·学习·golang
_Narcissus_5 小时前
排序算法总结表格
c语言·数据结构·c++·笔记·算法·排序算法·总结
新手unity自用笔记5 小时前
unity基于Socket的网络学习
网络·网络协议·学习·unity·c#·游戏引擎
zyf1044165 小时前
暑期实践日志 Day32:完成第六章字幕添加,推进工作
学习·计算机网络·剪辑·暑期实践·课题任务
小雪崩5 小时前
嵌入式学习 day27:标准IO
linux·c语言·学习
hsjiasb5 小时前
FreeRTOS学习(三十五)——系统架构综合项目
学习·学习笔记·freertos
YM52e6 小时前
语言地区选择器-鸿蒙ArkTS国际化页面设计
学习·华为·harmonyos