考研数据结构——C语言实现二叉树前,中,后序非递归遍历

  1. 定义二叉树节点(BTree)

    • ElemType value:存储节点的值。
    • struct BTree* LeftChild:指向左子节点的指针。
    • struct BTree* RightChild:指向右子节点的指针。
  2. 节点访问函数(visit)

    • 用于在遍历过程中访问节点的值,这里简单地打印出来。
  3. 创建新节点函数(createNode)

    • 动态分配内存来创建一个新的节点,并初始化其值和子节点指针。
  4. 栈结构体(Stack)及其操作函数

    • 用于存储节点指针的栈,最大长度为100。
    • initStack:初始化栈。
    • IsEmpty:检查栈是否为空。
    • IsFull:检查栈是否已满。
    • Push:将节点压入栈。
    • Pop:从栈中弹出节点。
  5. 非递归遍历函数

    • 前序遍历(PreorderTraversalNonRecursive):先访问根节点,然后递归遍历左子树,最后递归遍历右子树。这里使用栈来模拟递归过程,先遍历左子树,然后处理根节点,最后处理右子树。
    • 中序遍历(InorderTraversalNonRecursive):先递归遍历左子树,然后访问根节点,最后递归遍历右子树。使用栈来保证左子树先被处理。
    • 后序遍历(PostorderTraversalNonRecursive):先递归遍历左子树,然后递归遍历右子树,最后访问根节点。这是最复杂的,因为它需要确保根节点是最后被访问的。这里使用了一个额外的指针lastVisited来记录上一个访问的节点,以确保右子树在根节点之前被访问。
  6. 释放二叉树内存(freeTree)

    • 递归地释放每个节点的内存,以避免内存泄漏。
  7. 主函数(main)

    • 创建一个简单的二叉树,用于测试非递归遍历函数。
    • 执行前序、中序和后序遍历,并打印结果。
    • 释放二叉树占用的内存。
#include <stdio.h>
#include <stdlib.h>typedef int ElemType;typedef struct BTree {ElemType value;struct BTree* LeftChild;struct BTree* RightChild;
} BTree;// 访问节点的函数
void visit(ElemType value) {printf("%d ", value);
}// 创建新节点
BTree* createNode(ElemType value) {BTree* newNode = (BTree*)malloc(sizeof(BTree));if (newNode == NULL) {printf("Memory allocation failed!\n");exit(1);}newNode->value = value;newNode->LeftChild = NULL;newNode->RightChild = NULL;return newNode;
}// 栈相关函数的声明
typedef struct Stack {BTree* elements[100]; // 假设栈最大长度为100int top;
} Stack;void initStack(Stack* S) {S->top = -1;
}int IsEmpty(Stack S) {return S.top == -1;
}int IsFull(Stack S) {return S.top == 99;
}void Push(Stack* S, BTree* p) {if (IsFull(*S)) {printf("Stack is full!\n");return;}S->elements[++S->top] = p;
}void Pop(Stack* S, BTree** p) {if (IsEmpty(*S)) {printf("Stack is empty!\n");return;}*p = S->elements[S->top--];
}// 前序遍历(非递归)
void PreorderTraversalNonRecursive(BTree* root) {Stack S;initStack(&S);BTree* node = root;while (node != NULL || !IsEmpty(S)) {while (node != NULL) {visit(node->value);Push(&S, node->RightChild);node = node->LeftChild;}if (!IsEmpty(S)) {Pop(&S, &node);}}
}// 中序遍历(非递归)
void InorderTraversalNonRecursive(BTree* root) {Stack S;initStack(&S);BTree* node = root;while (node != NULL || !IsEmpty(S)) {while (node != NULL) {Push(&S, node);node = node->LeftChild;}if (!IsEmpty(S)) {Pop(&S, &node);visit(node->value);node = node->RightChild;}}
}// 后序遍历(非递归)
void PostorderTraversalNonRecursive(BTree* root) {if (root == NULL) return;Stack S;initStack(&S);BTree* node = root;BTree* lastVisited = NULL;while (node != NULL || !IsEmpty(S)) {while (node != NULL) {Push(&S, node);node = node->LeftChild;}BTree* temp = NULL;if (!IsEmpty(S)) {temp = S.elements[S.top];if (temp->RightChild == NULL || temp->RightChild == lastVisited) {Pop(&S, &temp);visit(temp->value);lastVisited = temp;}else {node = temp->RightChild;}}}
}void freeTree(BTree* root) {if (root != NULL) {freeTree(root->LeftChild);freeTree(root->RightChild);free(root);}
}int main() {// 创建一个简单的二叉树进行测试BTree* root = createNode(1);root->LeftChild = createNode(2);root->RightChild = createNode(3);root->LeftChild->LeftChild = createNode(4);root->LeftChild->RightChild = createNode(5);root->RightChild->LeftChild = createNode(6);root->RightChild->RightChild = createNode(7);printf("Preorder traversal (non-recursive): ");PreorderTraversalNonRecursive(root);printf("\n");printf("Inorder traversal (non-recursive): ");InorderTraversalNonRecursive(root);printf("\n");printf("Postorder traversal (non-recursive): ");PostorderTraversalNonRecursive(root);printf("\n");// 释放内存freeTree(root);return 0;
}

结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/450386.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux SSH无密码使用私钥远程登录连接详细配置流程

文章目录 前言1. Linux 生成SSH秘钥对2. 修改SSH服务配置文件3. 客户端秘钥文件设置4. 本地SSH私钥连接测试5. Linux安装Cpolar工具6. 配置SSHTCP公网地址7. 远程SSH私钥连接测试8. 固定SSH公网地址9. 固定SSH地址测试 前言 本文将详细介绍如何将Linux SSH服务与cpolar相结合&…

【算法】深入理解布隆过滤器

1. 什么是布隆过滤器&#xff1f; 布隆过滤器&#xff08;Bloom Filter&#xff09;是一种空间效率极高的概率型数据结构&#xff0c;用于检测某个元素是否在一个集合中。与常见的数据结构如哈希表不同&#xff0c;布隆过滤器无法删除元素&#xff0c;并且会存在一定的误判率&…

实操部署amis-admin

当需要做一个web服务的时候&#xff0c;前端的实现很令我头疼。搜了一圈前端低代码框架后&#xff0c;注意到百度贡献的amis&#xff0c;通过json来写前端&#xff0c;很酷啊。不得不说&#xff0c;一个好的demo项目&#xff0c;真的能让人迅速进入状态&#xff0c;比直接看文档…

c++常用库函数

一.sort排序 快排的改进算法&#xff0c;评价复杂度为(nlogn). 1.用法 sort(起始地址&#xff0c;结束地址下一位&#xff0c;*比较函数) [起始地址&#xff0c;结束地址) (左开右闭) #include<bits/stdc.h> using namespace std; int main() {//sortvector<int&g…

基础sql

在执行删除操作之前&#xff0c;建议先运行一个 SELECT 查询来确认你要删除的记录。这可以帮助你避免误删数据。 删除字段id默认值为空字符串的所有数据 delete from users where id ; 删除字段id默认值为null的所有数据 delete from users where id is null; 删除字段upd…

msvcp140.dll重新安装的解决方法,msvcp140.dll丢失快速修复教程

msvcp140.dll丢失的问题是许多电脑用户经常遇到的问题。msvcp140.dll是Microsoft Visual C Redistributable Package的一部分&#xff0c;这个软件包包含了许多Windows系统运行所需的重要文件。当msvcp140.dll丢失时&#xff0c;可能会导致许多应用程序无法正常运行&#xff0c…

基于华为云智慧生活生态链设计的智能鱼缸

一. 引言 1.1 项目背景 随着智能家居技术的发展和人们对高品质生活的追求日益增长&#xff0c;智能鱼缸作为一种结合了科技与自然美的家居装饰品&#xff0c;正逐渐成为智能家居领域的新宠。本项目旨在设计一款基于华为云智慧生活生态链的智能鱼缸&#xff0c;它不仅能够提供…

初阶数据结构【2】--顺序表(详细且通俗易懂,不看一下吗?)

本章概述 线性表顺序表顺序表问题与思考彩蛋时刻&#xff01;&#xff01;&#xff01; 线性表 概念&#xff1a;一些在逻辑上成线性关系的数据结构的集合。线性表在逻辑上一定成线性结构&#xff0c;在物理层面上不一定成线性结构。常见的线性表&#xff1a;顺序表&#xff0…

学习文档(6)

Redis数据类型 Redis 常用的数据类型有哪些&#xff1f; Redis 中比较常见的数据类型有下面这些&#xff1a; 5 种基础数据类型&#xff1a;String&#xff08;字符串&#xff09;、List&#xff08;列表&#xff09;、Set&#xff08;集合&#xff09;、Hash&#xff08;散…

影楼即将倒闭!!!!stable diffusion comfyui制作:AI人像摄影专业工作流

最近我们在学习ComfyUI&#xff0c;并用它搭建的摄影写真工作流&#xff0c;只需几张照片即可生成可交付的艺术写真照。 AI写真有以下好处&#xff1a; 创意无限&#xff1a;AI写真可以创造出超越现实的场景和效果&#xff0c;为用户提供更多的创意空间。用户可以通过简单的输…

MySQL 读写分离

优质博文&#xff1a;IT-BLOG-CN 一、背景 随着机票业务不断增长&#xff0c;订单库的读性能遇到了挑战&#xff0c;因此对订单库进行读写分离操作。主要目的是提高数据库的并发性能和可扩展性。当系统的所有写操作效率尚可&#xff0c;读数据请求效率较低时&#xff0c;比如…

快速解决Windows端口被占用

检查占用的端口号,显示9210端口被占用 使用运行打开cmd&#xff0c;直接输入如下命令 netstat -ano | find "9210"可以看到 9210端口执行的进程是PID为26836 知道PID后打开电脑的任务管理器-详细信息,找到PID是26836的进程,可以看到是QQ,关掉就解决了

微软开源项目 Detours 详细介绍与使用实例分享

目录 1、Detours概述 2、Detours功能特性 3、Detours工作原理 4、Detours应用场景 5、Detours兼容性 6、Detours具体使用方法 7、Detours使用实例 - 使用Detours拦截系统库中的UnhandledExceptionFilter接口,实现对程序异常的拦截 C++软件异常排查从入门到精通系列教程…

路由通信 的 VLAN技术

一、VLAN基础 虚拟局域网&#xff08;Virtual Local Area Network&#xff0c;VLAN&#xff09; 根据管理功能、组织机构或应用类型对交换局域网进行分段而形成的逻辑网络。 交换机最多支持4094个VLAN&#xff0c;其中默认管理VLAN是VLAN1&#xff0c;不能创建&#xff0c;也…

Python爬虫使用示例-古诗词摘录

一、分析需求 目标地址&#xff1a; https://www.sou-yun.cn/Query.aspx?typepoem&id二、提取诗句 import os import re import requests import parsel#url https://www.sou-yun.cn/PoemIndex.aspx?dynastyTang&author14976&typeJie urlhttps://www.sou-yun.…

关于md5强比较和弱比较绕过的实验

在ctf比赛题中我们的md5强弱比较的绕过题型很多&#xff0c;大部分都是结合了PHP来进行一个考核。这一篇文章我将讲解一下最基础的绕过知识。 MD5弱比较 比较的步骤 在进行弱比较时&#xff0c;PHP会按照以下步骤执行&#xff1a; 确定数据类型&#xff1a;检查参与比较的两…

【文心智能体 | AI大师工坊】如何使用智能体插件,完成一款购物类智能体的开发,来体验一下我的智能体『科技君Tom』

目录 1.1、智能体运行效果1.2、创作灵感来源智能体平台拥有个人化且人性化的大致框架&#xff0c;可以让小白也能搭建出一个智能体其次是拥有丰富的插件&#xff0c;可以更加快速的得到自己想要的效果~ 1.3、如何制作智能体常见问题与解决方案关于人设与回复逻辑插件使用模型的…

【02】Windows特殊权限-Trustedinstaller

知识点&#xff1a; “TrustedInstaller” 是 Windows 操作系统中的一个特殊账户&#xff0c;用于管理和保护重要的系统文件。它是 Windows 模块安装程序 (Windows Modules Installer) 的一部分&#xff0c;负责安装、修改和删除 Windows 更新和可选组件。默认情况下&#xff…

【Java SE 】类和对象详解

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 1&#xff0c; 面向对象认识 1.1 什么时面向对象 1.2 面向对象和面向过程 1.2.1 一个例子理解对象和过程 1. 对于电脑来说 2. 对于我们人来说 2. 类的定…

linux用户态条件变量和内核态完成变量

如果我们的线程要等一个条件满足之后才可以继续向下执行&#xff0c;这个条件不满足的话&#xff0c;就要等待这个条件。这种场景经常见到&#xff0c;比如我们使用recv接收网络数据的时候&#xff0c;或者使用epoll_wait来等待事件的时候&#xff0c;在默认情况下&#xff0c;…