二叉树的遍历

二叉树遍历是按特定规则访问树中每个节点一次且仅一次的过程,核心目的是将树形结构数据转化为线性序列。 

三种基本遍历方式(以根节点为基准)

1. 前序遍历(根左右)

顺序:先访问根节点,再递归遍历左子树,最后递归遍历右子树。

2. 中序遍历(左根右)

顺序:先递归遍历左子树,再访问根节点,最后递归遍历右子树。

3. 后序遍历(左右根)

顺序:先递归遍历左子树,再递归遍历右子树,最后访问根节点。

以下是用 C 语言实现二叉树三种遍历(前序、中序、后序)的完整代码,包含二叉树的创建、遍历和释放功能:

 

#include   

#include   

// 定义二叉树节点结构  

typedef struct Node {  

    int data;  

    struct Node *left; // 左子节点指针  

    struct Node *right; // 右子节点指针  

} Node;  

// 创建新节点(数据域初始化,左右指针置空)  

Node* createNode(int data) {  

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

    if (newNode == NULL) {  

        printf("内存分配失败!\n");  

        return NULL;  

    }  

    newNode->data = data;  

    newNode->left = NULL;  

    newNode->right = NULL;  

    return newNode;  

}  

// 前序遍历(根左右)  

void preOrderTraversal(Node* root) {  

    if (root != NULL) {  

        printf("%d ", root->data); // 访问根节点  

        preOrderTraversal(root->left); // 递归遍历左子树  

        preOrderTraversal(root->right); // 递归遍历右子树  

    }  

}  

// 中序遍历(左根右)  

void inOrderTraversal(Node* root) {  

    if (root != NULL) {  

        inOrderTraversal(root->left); // 递归遍历左子树  

        printf("%d ", root->data); // 访问根节点  

        inOrderTraversal(root->right); // 递归遍历右子树  

    }  

}  

// 后序遍历(左右根)  

void postOrderTraversal(Node* root) {  

    if (root != NULL) {  

        postOrderTraversal(root->left); // 递归遍历左子树  

        postOrderTraversal(root->right); // 递归遍历右子树  

        printf("%d ", root->data); // 访问根节点  

    }  

}  

// 释放二叉树内存(后序遍历方式释放,避免内存泄漏)  

void freeTree(Node* root) {  

    if (root != NULL) {  

        freeTree(root->left);  

        freeTree(root->right);  

        free(root);  

    }  

}  

int main() {  

    // 手动构建示例二叉树(对应前文示例结构)  

    // 1  

    // / \  

    // 2 3  

    // /  

    // 4  

    Node* root = createNode(1);  

    root->left = createNode(2);  

    root->right = createNode(3);  

    root->right->left = createNode(4);  

    printf("前序遍历结果:");  

    preOrderTraversal(root); // 输出:1 2 3 4  

    printf("\n");  

    printf("中序遍历结果:");  

    inOrderTraversal(root); // 输出:2 1 4 3  

    printf("\n");  

   printf("后序遍历结果:");  

    postOrderTraversal(root); // 输出:2 4 3 1  

    printf("\n");  

    // 释放二叉树内存  

    freeTree(root);  

    return 0;  

}  

你可能感兴趣的:(c语言)