当前位置: 首页 > article >正文

【数据结构】假设二叉树采用二叉链表存储,编写一棵二又树中序遍历的非递归算法。

编程题:

假设二叉树采用二叉链表存储,编写一棵二又树中序遍历的非递归算法。

在这里插入图片描述

分析:
算法描述:
非递归中序遍历二叉树的算法使用栈来辅助实现。首先,从根节点开始,沿着左子树不断向下,
将每个节点压入栈中。当到达最左端节点后,开始出栈并访问节点,接着转向右子树,重复这
一过程,直到栈为空且当前节点为 NULL。这种方法确保按左-根-右的顺序访问每个节点。

#include <stdio.h>
#include <stdlib.h>
/*
七、(16 分)假设二叉树采用二叉链表存储,编写一棵二又树中序遍历的非递归算法。
算法描述:
非递归中序遍历二叉树的算法使用栈来辅助实现。首先,从根节点开始,沿着左子树不断向下,
将每个节点压入栈中。当到达最左端节点后,开始出栈并访问节点,接着转向右子树,重复这
一过程,直到栈为空且当前节点为 NULL。这种方法确保按左-根-右的顺序访问每个节点。
*/

#if 0
typedef struct TreeNode {
    int data;                  // 节点数据
    struct TreeNode* left;    // 左子树指针
    struct TreeNode* right;   // 右子树指针
} TreeNode;

//非递归中序遍历算法
void inorderTraversal(TreeNode* root) {
    TreeNode** stack = (TreeNode**)malloc(100 * sizeof(TreeNode*)); // 动态分配栈
    int top = -1;         // 栈顶指针
    TreeNode* current = root;

    while (current != NULL || top != -1) {
        // 将所有左子树节点压入栈中
        while (current != NULL) {
            stack[++top] = current; // 压入栈
            current = current->left; // 移动到左子节点
        }

        // 处理栈顶节点
        current = stack[top--]; // 弹出栈顶节点
        printf("%d ", current->data); // 访问节点

        // 处理右子树
        current = current->right; // 移动到右子节点
    }
    free(stack); // 释放栈内存
}

int main() {
    // 构建一个简单的二叉树
    TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
    root->data = 1;
    root->left = (TreeNode*)malloc(sizeof(TreeNode));
    root->left->data = 2;
    root->right = (TreeNode*)malloc(sizeof(TreeNode));
    root->right->data = 3;
    root->left->left = (TreeNode*)malloc(sizeof(TreeNode));
    root->left->left->data = 4;
    root->left->right = (TreeNode*)malloc(sizeof(TreeNode));
    root->left->right->data = 5;

    root->left->left->left = NULL; // 确保左子树指针为NULL
    root->left->left->right = NULL;
    root->left->right->left = NULL;
    root->left->right->right = NULL;
    root->right->left = NULL;
    root->right->right = NULL;

    // 中序遍历
    printf("中序遍历结果: ");
    inorderTraversal(root); // 输出: 4 2 5 1 3
    printf("\n");

    // 释放内存
    free(root->left->right);
    free(root->left->left);
    free(root->left);
    free(root->right);
    free(root);

    return 0;
}
#endif

在这里插入图片描述

//非递归中序遍历算法
void inorderTraversal(TreeNode* root) {
    TreeNode** stack = (TreeNode**)malloc(100 * sizeof(TreeNode*)); // 动态分配栈
    int top = -1;         // 栈顶指针
    TreeNode* current = root;

    while (current != NULL || top != -1) {
        // 将所有左子树节点压入栈中
        while (current != NULL) {
            stack[++top] = current; // 压入栈
            current = current->left; // 移动到左子节点
        }

        // 处理栈顶节点
        current = stack[top--]; // 弹出栈顶节点
        printf("%d ", current->data); // 访问节点

        // 处理右子树
        current = current->right; // 移动到右子节点
    }
    free(stack); // 释放栈内存
}

解法不一,欢迎评论区交流。


http://www.kler.cn/a/321299.html

相关文章:

  • 【C++基础】09、结构体
  • EsChatPro 接入国内 DeepSeek 大模型
  • 如何查看pad的console输出,以便我们更好的进行调试,查看并了解实际可能的问题。
  • HTMLCSS:惊!3D 折叠按钮
  • 【蓝桥杯——物联网设计与开发】基础模块8 - RTC
  • SpringBoot简单使用Stomp
  • Apache技术深度解析与实战案例
  • Pydantic 是一个强大的 Python 库
  • EVM理解:深入理解EVM的运作方式,包括Gas机制、交易执行流程等。
  • 【IOS】申请开发者账号(公司)
  • C++ 排序算法
  • 基于51单片机的方向盘模拟系统
  • OJ在线评测系统 后端 使用代理模式编写测试类 并 实现核心业务判题流程
  • 开源治理聚光灯 | 企业规模不同,治理方式各显神通
  • 【openwrt-21.02】VPN Passthrough系列之L2TP Passthrough实现
  • 谷神后端$vs.dbTools.list
  • Windows安装Vim,并在PowerShell中直接使用vim
  • 【裸机装机系列】16.kali(ubuntu)-安装linux和win双系统-重装win11步骤
  • React Native中如何调用iOS的Face ID和Android的生物识别,react-native-biometrics
  • 【深度学习】04-Cnn卷积神经网络-01- 卷积神经网络概述/卷积层/池化层/分类案例精讲
  • 【MySQL】数据库--索引
  • 未来数字世界相关技术、应用:AR/VR/MR;数字人、元宇宙、全息显示
  • 开源链动 2+1 模式 S2B2C 商城小程序:激活 KOC,开启商业新征程
  • 将Mixamo的模型和动画导入UE5
  • C--结构体和位段的使用方法
  • 一道涉及 Go 中的并发安全和数据竞态(Race Condition)控制的难题