legongju.com
我们一直在努力
2025-01-10 00:20 | 星期五

c语言如何实现二叉树的中序遍历

在C语言中,可以通过递归或迭代的方式来实现二叉树的中序遍历。这里给出两种方法的代码示例:

方法一:递归

#include 
#include 

// 定义二叉树节点结构体
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
};

// 中序遍历的递归函数
void inorderTraversal(struct TreeNode* node) {
    if (node == NULL) {
        return;
    }
    inorderTraversal(node->left);  // 遍历左子树
    printf("%d ", node->val);       // 访问根节点
    inorderTraversal(node->right); // 遍历右子树
}

// 创建新节点的辅助函数
struct TreeNode* newNode(int val) {
    struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
    node->val = val;
    node->left = NULL;
    node->right = NULL;
    return node;
}

int main() {
    // 创建示例二叉树
    struct TreeNode* root = newNode(1);
    root->right = newNode(2);
    root->right->left = newNode(3);

    // 执行中序遍历
    inorderTraversal(root);

    return 0;
}

方法二:迭代(使用栈)

#include 
#include 
#include 

// 定义二叉树节点结构体
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
};

// 中序遍历的迭代函数
void inorderTraversal(struct TreeNode* root) {
    if (root == NULL) {
        return;
    }

    struct Stack* stack = (struct Stack*)malloc(sizeof(struct Stack));
    struct TreeNode* currentNode = root;

    while (currentNode != NULL || !isEmpty(stack)) {
        // 遍历左子树,将节点压入栈中
        while (currentNode != NULL) {
            stackPush(stack, currentNode);
            currentNode = currentNode->left;
        }

        // 弹出栈顶元素,访问节点,并转向右子树
        currentNode = stackPop(stack);
        printf("%d ", currentNode->val);
        currentNode = currentNode->right;
    }

    free(stack);
}

// 栈结构体定义及操作函数
struct Stack {
    struct TreeNode** data;
    int top;
    int capacity;
};

void initStack(struct Stack* stack, int capacity) {
    stack->data = https://www.yisu.com/ask/(struct TreeNode**)malloc(capacity * sizeof(struct TreeNode*));>top = -1;
    stack->capacity = capacity;
}

bool isEmpty(struct Stack* stack) {
    return stack->top == -1;
}

void stackPush(struct Stack* stack, struct TreeNode* node) {
    if (stackIsFull(stack)) {
        printf("Stack overflow\n");
        return;
    }
    stack->data[++stack->top] = node;
}

struct TreeNode* stackPop(struct Stack* stack) {
    if (isEmpty(stack)) {
        printf("Stack underflow\n");
        return NULL;
    }
    return stack->data[stack->top--];
}

bool stackIsFull(struct Stack* stack) {
    return stack->top == stack->capacity - 1;
}

int main() {
    // 创建示例二叉树
    struct TreeNode* root = newNode(1);
    root->right = newNode(2);
    root->right->left = newNode(3);

    // 执行中序遍历
    inorderTraversal(root);

    return 0;
}

这两种方法都可以实现二叉树的中序遍历。递归方法更简洁直观,但可能受到栈空间限制;迭代方法使用显式栈来避免栈溢出的问题,但代码相对复杂。

未经允许不得转载 » 本文链接:https://www.legongju.com/article/67904.html

相关推荐

  • 如何正确使用c语言的while循环

    如何正确使用c语言的while循环

    在C语言中,while循环是一种基本的控制结构,用于重复执行一段代码,直到给定条件不再满足
    #include int main() { int counter = 1; // 初始化计数器 // 当...

  • while循环在c语言中的优势是什么

    while循环在c语言中的优势是什么

    在C语言中,while循环具有一定的优势,主要体现在以下几个方面: 简洁性:while循环结构简单,易于理解。它只需要一个条件表达式,当条件为真时,循环体内的代码...

  • c语言中while循环的基本用法

    c语言中while循环的基本用法

    在C语言中,while循环是一种基本的控制结构,用于重复执行一段代码,直到给定的条件不再满足。while循环的基本语法如下:
    while (condition) { // 循环体(...

  • while循环在c语言中的错误处理

    while循环在c语言中的错误处理

    在C语言中,while循环用于重复执行一段代码,直到给定的条件不再满足。然而,如果在编写while循环时出现错误,可能会导致程序陷入无限循环或其他问题。以下是一些...

  • c语言如何编写加减乘除

    c语言如何编写加减乘除

    在C语言中,进行加减乘除运算非常简单。以下是一些示例: 加法: #include int main() { int a = 10; int b = 20; int sum = a + b; printf("Sum: %d\n", sum); ...

  • c语言如何编写魔方阵

    c语言如何编写魔方阵

    在C语言中编写一个魔方阵需要遵循以下步骤: 引入必要的头文件。
    定义一个函数,用于生成魔方阵。
    在主函数中调用该函数,并输出结果。 以下是一个简单...

  • c语言如何求级数的和

    c语言如何求级数的和

    在C语言中,可以使用循环来逐个计算级数的每一项,并将它们累加起来得到级数的和。以下是一个示例代码,用于计算一个简单的级数(例如:1 + 1/2 + 1/3 + 1/4 + …...

  • c语言3个数从小到大排列如何实现

    c语言3个数从小到大排列如何实现

    在C语言中,实现三个数从小到大排列的一种常见方法是使用排序算法。这里,我将向您展示如何使用冒泡排序算法对三个数进行排序。冒泡排序是一种简单的排序算法,它...