数据结构与C 知识量:8 - 24 - 99
树的先根遍历(Preorder Traversal)是一种树的遍历方式,按照“根节点-左子树-右子树”的顺序进行遍历。在先根遍历中,首先访问根节点,然后递归地先根遍历左子树,最后递归地先根遍历右子树。
以下是树的先根遍历的示例代码:
#include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node *left; struct Node *right; } Node; void preorderTraversal(Node* root) { if (root == NULL) return; // 节点为空,返回空值。 printf("%d ", root->data); // 访问根节点 if (root->left != NULL) { // 递归遍历左子树 preorderTraversal(root->left); } if (root->right != NULL) { // 递归遍历右子树 preorderTraversal(root->right); } } int main() { Node* root = newNode(1); root->left = newNode(2); root->right = newNode(3); root->left->left = newNode(4); root->left->right = newNode(5); printf("先序遍历结果:"); preorderTraversal(root); printf("\n"); return 0; }
在上面的代码中,preorderTraversal函数是实现先根遍历的核心函数。它首先访问根节点,然后递归地先根遍历左子树,最后递归地先根遍历右子树。在主函数中,创建了一个简单的二叉树,并调用preorderTraversal函数进行先根遍历,并输出结果。
树的后根遍历(Postorder Traversal)是一种树的遍历方式,按照“左子树-右子树-根节点”的顺序进行遍历。在后根遍历中,首先递归地后根遍历左子树,然后递归地后根遍历右子树,最后访问根节点。
以下是树的后根遍历的示例代码:
#include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node *left; struct Node *right; } Node; void postorderTraversal(Node* root) { if (root == NULL) return; // 节点为空,返回空值。 if (root->left != NULL) { // 递归遍历左子树 postorderTraversal(root->left); } if (root->right != NULL) { // 递归遍历右子树 postorderTraversal(root->right); } printf("%d ", root->data); // 访问根节点 } int main() { Node* root = newNode(1); root->left = newNode(2); root->right = newNode(3); root->left->left = newNode(4); root->left->right = newNode(5); printf("后序遍历结果:"); postorderTraversal(root); printf("\n"); return 0; }
在上面的代码中,postorderTraversal函数是实现后根遍历的核心函数。它首先递归地后根遍历左子树,然后递归地后根遍历右子树,最后访问根节点。在主函数中,创建了一个简单的二叉树,并调用postorderTraversal函数进行后根遍历,并输出结果。
森林的前序遍历是一种遍历方式,按照“根节点-左子树-右子树”的顺序进行遍历。
以下是森林的前序遍历的示例代码:
#include <stdio.h> #include <stdlib.h> typedef struct TreeNode { int data; struct TreeNode *left; struct TreeNode *right; } TreeNode; typedef struct StackNode { TreeNode *data; struct StackNode *next; } StackNode; void push(StackNode **stack, TreeNode *node) { StackNode *new_node = (StackNode *)malloc(sizeof(StackNode)); new_node->data = node; new_node->next = *stack; *stack = new_node; } TreeNode *pop(StackNode **stack) { if (*stack == NULL) { return NULL; } StackNode *top = *stack; TreeNode *data = top->data; *stack = top->next; free(top); return data; } void preorderTraversal(TreeNode *root) { if (root == NULL) return; // 节点为空,返回空值。 StackNode *stack = NULL; push(&stack, root); // 将根节点入栈 while (stack != NULL) { // 循环直到栈为空 TreeNode *node = pop(&stack); // 弹出栈顶元素并返回其数据指针 printf("%d ", node->data); // 访问节点数据并打印出来 if (node->left != NULL) { // 如果左子树不为空,则将左子树入栈 push(&stack, node->left); } if (node->right != NULL) { // 如果右子树不为空,则将右子树入栈 push(&stack, node->right); } } } int main() { TreeNode *root = newNode(1); root->left = newNode(2); root->right = newNode(3); root->left->left = newNode(4); root->left->right = newNode(5); printf("前序遍历结果:"); preorderTraversal(root); printf("\n"); return 0; }
在上面的代码中,preorderTraversal函数是实现森林的前序遍历的核心函数。它使用一个栈来辅助实现前序遍历,将根节点入栈,然后依次弹出栈顶元素并访问其数据,如果左子树不为空则将左子树入栈,如果右子树不为空则将右子树入栈,直到栈为空为止。在主函数中,创建了一个简单的森林,并调用preorderTraversal函数进行前序遍历,并输出结果。
森林的中序遍历是一种遍历方式,按照“左子树-根节点-右子树”的顺序进行遍历。
在C语言中,可以使用递归或迭代的方式实现中序遍历。以下是使用递归方式实现的示例代码:
#include <stdio.h> #include <stdlib.h> typedef struct TreeNode { int data; struct TreeNode *left; struct TreeNode *right; } TreeNode; void inorderTraversal(TreeNode *root) { if (root == NULL) return; // 节点为空,返回空值。 inorderTraversal(root->left); // 递归遍历左子树 printf("%d ", root->data); // 访问根节点并打印数据 inorderTraversal(root->right); // 递归遍历右子树 } int main() { TreeNode *root = newNode(1); root->left = newNode(2); root->right = newNode(3); root->left->left = newNode(4); root->left->right = newNode(5); printf("中序遍历结果:"); inorderTraversal(root); printf("\n"); return 0; }
在上面的代码中,inorderTraversal函数是实现森林的中序遍历的核心函数。它使用递归的方式遍历森林的左子树、访问根节点、然后遍历森林的右子树。在主函数中,创建了一个简单的森林,并调用inorderTraversal函数进行中序遍历,并输出结果。
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6