龙空技术网

C语言遍历二叉树实际应用例子

灵思致远IT学苑 131

前言:

如今你们对“二叉树的先序中序后序遍历代码c语言”可能比较关心,你们都需要分析一些“二叉树的先序中序后序遍历代码c语言”的相关文章。那么小编也在网上网罗了一些关于“二叉树的先序中序后序遍历代码c语言””的相关文章,希望兄弟们能喜欢,朋友们快快来了解一下吧!

遍历二叉树是指按照一定的顺序遍历二叉树中的每个节点,包括先序遍历、中序遍历和后序遍历三种。

一个实际应用例子是在文件目录中查找所有文件名包含指定字符串的文件,并将这些文件名输出到一个文件中。可以用二叉树来表示整个文件目录,每个节点表示一个文件或文件夹,将文件名作为节点的值。然后通过先序遍历遍历整个二叉树,找到包含指定字符串的节点,记录它们的路径,即可得到所有符合条件的文件。

代码实现如下(以 Windows 系统为例):

```c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <windows.h>

#define MAX_PATH_LENGTH 1000 // 文件路径的最大长度

#define MAX_NAME_LENGTH 100 // 文件名的最大长度

#define MAX_KEYWORD_LENGTH 100 // 指定字符串的最大长度

typedef struct Node { // 二叉树节点

char name[MAX_NAME_LENGTH]; // 文件名或文件夹名

struct Node *left, *right; // 左右子节点

} Node;

Node *CreateNode(char *name) { // 创建新节点

Node *node = (Node *)malloc(sizeof(Node));

strcpy(node->name, name);

node->left = node->right = NULL;

return node;

}

void DestroyTree(Node *root) { // 销毁二叉树

if (root == NULL) return;

DestroyTree(root->left);

DestroyTree(root->right);

free(root);

}

void PreOrderTraverse(Node *root, char *path, int depth, char *keyword, FILE *fp) { // 先序遍历二叉树

if (root == NULL) return;

char currPath[MAX_PATH_LENGTH];

sprintf(currPath, "%s\\%s", path, root->name); // 记录当前节点的路径

if (strstr(root->name, keyword) != NULL) { // 找到包含指定字符串的节点

fwrite(currPath, sizeof(char), strlen(currPath), fp); // 将路径输出到文件中

fwrite("\n", sizeof(char), 1, fp);

}

PreOrderTraverse(root->left, currPath, depth + 1, keyword, fp); // 遍历左子树

PreOrderTraverse(root->right, currPath, depth + 1, keyword, fp); // 遍历右子树

}

int main() {

char rootPath[MAX_PATH_LENGTH] = "C:"; // 文件目录的根路径

char keyword[MAX_KEYWORD_LENGTH] = "test"; // 指定的字符串

Node *root = CreateNode(rootPath); // 创建根节点

WIN32_FIND_DATA fd;

HANDLE hFind = FindFirstFile("C:\\*.*", &fd); // 获取 C 盘下的所有文件和文件夹

if (hFind != INVALID_HANDLE_VALUE) {

do {

if (strcmp(fd.cFileName, ".") == 0 || strcmp(fd.cFileName, "..") == 0) continue; // 跳过 . 和 ..

Node *node = CreateNode(fd.cFileName);

if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { // 如果是文件夹则继续遍历

char path[MAX_PATH_LENGTH];

sprintf(path, "%s\\%s", rootPath, fd.cFileName);

WIN32_FIND_DATA fd1;

HANDLE hFind1 = FindFirstFile(path, &fd1);

if (hFind1 != INVALID_HANDLE_VALUE) {

do {

if (strcmp(fd1.cFileName, ".") == 0 || strcmp(fd1.cFileName, "..") == 0) continue;

Node *node1 = CreateNode(fd1.cFileName);

if (fd1.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) continue;

if (strstr(fd1.cFileName, keyword) != NULL) { // 如果文件名包含指定字符串则输出路径

char currPath[MAX_PATH_LENGTH];

sprintf(currPath, "%s\\%s\\%s", rootPath, fd.cFileName, fd1.cFileName);

printf("%s\n", currPath);

}

free(node1);

} while (FindNextFile(hFind1, &fd1));

FindClose(hFind1);

}

} else { // 如果是文件则判断文件名是否包含指定字符串

if (strstr(fd.cFileName, keyword) != NULL) { // 如果文件名包含指定字符串则输出路径

char currPath[MAX_PATH_LENGTH];

sprintf(currPath, "%s\\%s", rootPath, fd.cFileName);

printf("%s\n", currPath);

}

}

free(node);

} while (FindNextFile(hFind, &fd));

FindClose(hFind);

}

FILE *fp;

fopen_s(&fp, "result.txt", "w"); // 打开输出文件

PreOrderTraverse(root, "", 0, keyword, fp); // 先序遍历二叉树,输出符合条件的文件路径

fclose(fp);

DestroyTree(root); // 销毁二叉树

return 0;

}

```

测试结果如下:

![遍历二叉树测试结果]()

标签: #二叉树的先序中序后序遍历代码c语言