实验目的

本实验旨在熟悉二叉树的基本概念和操作,掌握二叉树的遍历方式,以及了解二叉树在实际应用中的一些常见场景。

实验内容

本实验内容包括以下几个部分:

  1. 二叉树的创建
  2. 二叉树的遍历
  3. 二叉树的一些应用实例

实验原理

  1. 二叉树的创建 二叉树是一种特殊的树形结构,每个节点最多有两个子节点,分别称为左子节点和右子节点,因此又称为左右子树。在二叉树中,每个节点都有一个唯一的父节点,除了根节点没有父节点。二叉树的创建可以通过递归和非递归方式实现。

  2. 二叉树的遍历 二叉树的遍历方式有三种,分别为前序遍历、中序遍历和后序遍历。前序遍历是先访问根节点,然后按照先左后右的顺序遍历子树;中序遍历是按照先左后根再右的顺序遍历子树;后序遍历是按照先左后右再根的顺序遍历子树。

  3. 二叉树的一些应用实例 二叉树在实际应用中有很多场景,比如文件系统的目录结构、编译器中的语法树、哈夫曼编码中的编码树等。

实验步骤

  1. 二叉树的创建 本实验使用递归方式创建二叉树,具体步骤如下: (1)定义二叉树节点结构体; (2)实现递归方式创建二叉树的函数'createBinaryTree()'; (3)在主函数中调用'createBinaryTree()'函数创建二叉树。

代码实现如下:

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

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

struct TreeNode* createBinaryTree() {
    int data;
    struct TreeNode *node;
    printf("请输入节点的值(-1表示空节点):");
    scanf("%d", &data);
    if (data == -1) {
        node = NULL;
    } else {
        node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
        node->data = data;
        printf("请输入%d的左子节点:", data);
        node->left = createBinaryTree();
        printf("请输入%d的右子节点:", data);
        node->right = createBinaryTree();
    }
    return node;
}

int main() {
    struct TreeNode *root;
    root = createBinaryTree();
    printf("二叉树创建成功!\n");
    return 0;
}
  1. 二叉树的遍历 本实验实现前序遍历、中序遍历和后序遍历三种遍历方式,具体步骤如下: (1)实现前序遍历函数'preOrderTraversal()'; (2)实现中序遍历函数'inOrderTraversal()'; (3)实现后序遍历函数'postOrderTraversal()'; (4)在主函数中调用三个遍历函数。

代码实现如下:

void preOrderTraversal(struct TreeNode *root) {
    if (root != NULL) {
        printf("%d ", root->data);
        preOrderTraversal(root->left);
        preOrderTraversal(root->right);
    }
}

void inOrderTraversal(struct TreeNode *root) {
    if (root != NULL) {
        inOrderTraversal(root->left);
        printf("%d ", root->data);
        inOrderTraversal(root->right);
    }
}

void postOrderTraversal(struct TreeNode *root) {
    if (root != NULL) {
        postOrderTraversal(root->left);
        postOrderTraversal(root->right);
        printf("%d ", root->data);
    }
}

int main() {
    struct TreeNode *root;
    root = createBinaryTree();
    printf("前序遍历结果:");
    preOrderTraversal(root);
    printf("\n中序遍历结果:");
    inOrderTraversal(root);
    printf("\n后序遍历结果:");
    postOrderTraversal(root);
    return 0;
}
  1. 二叉树的一些应用实例 本实验实现二叉树在文件系统的目录结构中的应用,具体步骤如下: (1)定义文件目录结构体; (2)实现递归方式创建文件目录树的函数'createFileTree()'; (3)在主函数中调用'createFileTree()'函数创建文件目录树; (4)实现前序遍历函数'preOrderTraversal()'; (5)在主函数中调用'preOrderTraversal()'函数遍历文件目录树。

代码实现如下:

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

struct FileInfo {
    char name[100];
    int type; // 0表示文件夹,1表示文件
    struct FileInfo *subFiles;
    struct FileInfo *next;
};

struct FileInfo* createFileTree() {
    struct FileInfo *node, *p, *q;
    char name[100];
    int type, flag;
    printf("请输入文件夹的名字:");
    scanf("%s", name);
    node = (struct FileInfo*)malloc(sizeof(struct FileInfo));
    strcpy(node->name, name);
    node->type = 0;
    node->subFiles = NULL;
    node->next = NULL;
    printf("该文件夹下是否有子文件(0表示没有,1表示有):");
    scanf("%d", &flag);
    if (flag == 1) {
        printf("请输入子文件的个数:");
        int n;
        scanf("%d", &n);
        for (int i = 0; i < n; i++) {
            printf("请输入第%d个子文件的名字:", i + 1);
            scanf("%s", name);
            printf("该文件是文件还是文件夹(0表示文件夹,1表示文件):");
            scanf("%d", &type);
            p = (struct FileInfo*)malloc(sizeof(struct FileInfo));
            strcpy(p->name, name);
            p->type = type;
            p->subFiles = NULL;
            p->next = NULL;
            if (node->subFiles == NULL) {
                node->subFiles = p;
            } else {
                q->next = p;
            }
            q = p;
            if (type == 0) {
                p->subFiles = createFileTree();
            }
        }
    }
    return node;
}

void preOrderTraversal(struct FileInfo *root, int level) {
    for (int i = 0; i < level; i++) {
        printf("    ");
    }
    printf("|-- %s\n", root->name);
    struct FileInfo *p = root->subFiles;
    while (p != NULL) {
        preOrderTraversal(p, level + 1);
        p = p->next;
    }
}

int main() {
    struct FileInfo *root;
    root = createFileTree();
    printf("文件目录树创建成功!\n");
    preOrderTraversal(root, 0);
    return 0;
}

实验总结

本实验通过递归方式创建二叉树,实现了二叉树的前序遍历、中序遍历和后序遍历三种遍历方式,同时介绍了二叉树在文件系统的目录结构中的应用。通过本次实验,我进一步加深了对二叉树的理解和运用,掌握了一些二叉树的基本操作和应用场景,对于今后的学习和工作都非常有帮助。


原文地址: https://www.cveoy.top/t/topic/n7Jd 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录