数据结构与C

数据结构与C 知识量:8 - 24 - 99

5.5 遍历><

树的先根遍历- 5.5.1 -

树的先根遍历(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函数进行先根遍历,并输出结果。

树的后根遍历- 5.5.2 -

树的后根遍历(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函数进行后根遍历,并输出结果。

森林的前序遍历- 5.5.3 -

森林的前序遍历是一种遍历方式,按照“根节点-左子树-右子树”的顺序进行遍历。

以下是森林的前序遍历的示例代码:

#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函数进行前序遍历,并输出结果。

森林的中序遍历- 5.5.4 -

森林的中序遍历是一种遍历方式,按照“左子树-根节点-右子树”的顺序进行遍历。

在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函数进行中序遍历,并输出结果。