欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > 【数据结构】假设二叉树采用二叉链表存储,编写一棵二又树中序遍历的非递归算法。

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

2024/10/25 22:36:34 来源:https://blog.csdn.net/weixin_51086862/article/details/142387878  浏览:    关键词:【数据结构】假设二叉树采用二叉链表存储,编写一棵二又树中序遍历的非递归算法。

编程题:

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

在这里插入图片描述

分析:
算法描述:
非递归中序遍历二叉树的算法使用栈来辅助实现。首先,从根节点开始,沿着左子树不断向下,
将每个节点压入栈中。当到达最左端节点后,开始出栈并访问节点,接着转向右子树,重复这
一过程,直到栈为空且当前节点为 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; // 确保左子树指针为NULLroot->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 3printf("\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); // 释放栈内存
}

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com