C++数据结构之二叉树非递归操作

C++二叉搜索树的递归和非递归实现 二叉搜索树概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的左右子树也分别为二叉搜索树 二叉搜索树的应用 1. K模型:K模型即只有key作为关键码,结构中只需要存储Key即可,关键码即为需要搜索到的值。 比如:给一个单词word,判断该单词是否拼写正确,具体方式如下: 以单词集合中的每个单词作为key,构建一棵二叉搜索树 在二叉搜索树中 阅读详情
 

#include <iostream>

using namespace std;

const int MaxSize = 100;

template <typename T>          //二叉树的结点结构
struct BiNode
{
    T data;
    BiNode<T> *lchild,*rchild;
    BiNode<T> *btr;
    int flag;
};

template <typename T>
class BiTree
{
    private:
        BiNode<T> *root;
        BiNode<T> *Create();
        void Release(BiNode<T> *root);   //析构函数调用
    public:
        BiTree();                               //构造函数,初始化一棵二叉树,其前序序列由键盘输入
        ~BiTree();                              //析构函数,释放二叉链表中各结点的存储空间
        BiNode<T> *GetRoot();                   //获得指向根结点的指针
        void PreOrder(BiNode<T> *root);         //前序遍历二叉树
        void InOrder(BiNode<T> *root);          //中序遍历二叉树
        void PostOrder(BiNode<T> *root);        //后序遍历二叉树
        void LevelOrder(BiNode<T> *root);       //层序遍历二叉树
};

/*
 *前置条件:无
 *输    入:无
 *功    能:调用Create()函数
 *输    出:无
 *后置条件:无
*/
template <typename T>
BiTree<T>::BiTree()
{
    this->root = Create();
}

/*
 *前置条件:空二叉树
 *输    入:数据ch;
 *功    能:初始化一棵二叉树,构造函数调用
 *输    出:无
 *后置条件:产生一棵二叉树
 */
template <typename T>
BiNode<T> *BiTree<T>::Create()
{
    BiNode<T> *root;
    T ch;
    cin>>ch;
    if(ch == '#')
        root = NULL;
    else{
        root = new BiNode<T>;           //生成一个结点
        root->data = ch;
        root->lchild = Create();        //递归建立左子树
        root->rchild = Create();        //递归建立右子树
    }
    return root;
}

/*
 *前置条件:二叉树已存在
 *输    入:无
 *功    能:获取指向二叉树根结点的指针
 *输    出:指向二叉树根结点的指针
 *后置条件:二叉树不变
 */
template <typename T>
BiNode<T> *BiTree<T>::GetRoot()
{
    return root;
}

/*
 *前置条件:二叉树已存在
 *输    入:无
 *功    能:释放二叉链表中各结点的存储空间
 *输    出:无
 *后置条件:二叉树不存在
 */
template<class T>
BiTree<T>::~BiTree(void)
{
 Release(root);
}

/*
 *前置条件:二叉树已存在
 *输    入:无
 *功    能:前序非递归遍历二叉树
 *输    出:二叉树中结点的一个线性排列
 *后置条件:二叉树不变
 */
template <typename T>
void BiTree<T>::PreOrder(BiNode<T> *root)
{
    int top = -1;
    BiNode<T> *Stack[MaxSize];
    while(root != NULL || top != -1)
    {
        while(root != NULL)
        {
            cout<<root->data<<" ";
            Stack[++top] = root;
            root = root->lchild;
        }

        if(top != -1)
        {
            root = Stack[top--];
            root = root->rchild;
        }
    }
}

/*
 *前置条件:二叉树已存在
 *输    入:无
 *功    能:中序非递归遍历二叉树
 *输    出:二叉树中结点的一个线性排列
 *后置条件:二叉树不变
 */
template <typename T>
void BiTree<T>::InOrder(BiNode<T> *root)
{
    int top = -1;
    BiNode<T> *Stack[MaxSize];
    while(root != NULL || top != -1)
    {
        while(root != NULL)
        {
            Stack[++top] = root;
            root = root->lchild;
        }

        if(top != -1)
        {
            root = Stack[top--];
            cout<<root->data<<" ";
            root = root->rchild;
        }
    }
}

/*
 *前置条件:二叉树已存在
 *输    入:无
 *功    能:后序非递归遍历二叉树
 *输    出:二叉树中结点的一个线性排列
 *后置条件:二叉树不变
 */
template <typename T>
void BiTree<T>::PostOrder(BiNode<T> *root)
{
    int top = -1;
    BiNode<T> Stack[MaxSize];
    while(root != NULL || top != -1)
    {
        while(root != NULL)
        {
            top++;
            Stack[top].btr = root;
            Stack[top].flag = 0;
            root = root->lchild;
        }

        while(top != -1 && Stack[top].flag == 1)
        {
            root = Stack[top--].btr;
            cout<<root->data<<" ";
        }

        if(top != -1)
        {
            Stack[top].flag = 1;
            root =Stack[top].btr;
            root = root->rchild;
        }
        else
            break;
    }
}

/*
 *前置条件:二叉树已存在
 *输    入:无
 *功    能:层序遍历二叉树
 *输    出:二叉树中结点的一个线性排列
 *后置条件:二叉树不变
 */
template <typename T>
void BiTree<T>::LevelOrder(BiNode<T> *root)
{
    int front,rear;
    front = rear = 0;                       //采用顺序队列,并假定不会发生上溢
    BiNode<T> *Queue[MaxSize];
    if(root == NULL)
        return ;
    Queue[++rear] = root;
    while(front != rear)
    {
        BiNode<T> *btr;
        btr = Queue[++front];
        cout<<btr->data<<" ";
        if(btr->lchild != NULL)
            Queue[++rear] = btr->lchild;
        if(btr->rchild != NULL)
            Queue[++rear] = btr->rchild;
    }
}

/*
 *前置条件:二叉树已经存在
 *输    入:无
 *功    能:释放二叉树的存储空间,析构函数调用
 *输    出:无
 *后置条件:二叉树不存在
 */
template<class T>
void BiTree<T>::Release(BiNode<T>* root)
{
  if (root != NULL){
   Release(root->lchild);   //释放左子树
      Release(root->rchild);   //释放右子树
      delete root;
  }
}

int main()
{
    BiTree<char> bitree;                            //创建一棵树
    BiNode<char> *binode;
    binode = bitree.GetRoot();                      //获取指向根结点的指针
    cout<<"------前序非递归遍历------"<<endl;
    bitree.PreOrder(binode);
    cout<<endl;
    cout<<"------中序非递归遍历------"<<endl;
    bitree.InOrder(binode);
    cout<<endl;
    cout<<"------后序非递归遍历------"<<endl;
    bitree.PostOrder(binode);
    cout<<endl;
    cout<<"------层序遍历------"<<endl;
    bitree.LevelOrder(binode);
    cout<<endl;
    return 0;
}

C++实现二叉树的创建以及四种遍历方式(递归与非递归) C++实现二叉树的创建以及四种遍历方式(递归与非递归) 语言这个东西不用真的会忘, 我记得前前后后C++的基本语法我也看了好几遍了,一直没有动手写过什么东西,所以一遍遍的看,一遍遍的忘… … 正好最近在看数据结构,想着自己用C++来实现一下,一方面是熟悉整个逻辑过程,加深对数据结构的理解,另一方面,也熟悉一下C++。 下图是我们要创建的二叉树,其中的#代表空字符; 为了验证我们程序的正确性,现给出此二叉树的四种遍历结果: 前序遍历(Preorder traversal): A B C D E F 阅读详情

相关推荐

C++ 二叉树的遍历 前序 中序 后序 递归&非递归 层次

#include <iostream> #include <string> #include <queue> #include <stack> #include <math.h> using namespace std; typedef int datatype; class Node { public: datatype val; Node* left; Node* right; Node(datatype val) { th.

浪矢五金店 457

二叉树的非递归算法(C++实现)

接着上面一篇博客,我们开始叙述有关二叉树的非递归遍历的实现。 这里我们附上上一篇blog的链接:https://blog.youkuaiyun.com/weixin_36997518/article/details/81370049,废话少说,直接上代码。 首先是二叉树的中序遍历,这是二叉树尤为重要的一种遍历方式,虽然它在三种非递归方式中是最简单的,但是很多算法都是基于这种方法进行再创作。 //中序遍...

weixin_36997518的博客 2331

严蔚敏《数据结构》六类核心实验C++实现+图文报告(含链表、树、图、排序等)

这套资料直接对应严蔚敏《数据结构》教材教学进度,提供线性表、栈与队列、树与二叉树、图、查找、排序六大模块的完整上机实践支持。包含20多个可直接编译运行的C++工程,比如单链队列实现、哈夫曼编码生成、二叉树建立与先序/中序/后序遍历、结点数量统计、树深度计算、图的邻接表创建、深度优先与广度优先遍历、直接插入/选择/冒泡/快速排序算法实现、字符频次统计与翻译功能等。每个实验都配有独立文档说明,涵盖功能目标、算法逻辑、输入输出样例和运行结果分析。代码统一使用main.cpp入口,头文件head.h集中管理常用结构

w1x2y3的博客 248

非递归实现二叉树遍历(附c++完整代码)

先序、中序和后序遍历过程:遍历过程中经过结点的路线一样,只是访问各结点的时机不同。 从图中可以看到,前序遍历在第一次遇见元素时输出,中序遍历在第二次遇见元素时输出,后序遍历在第三次遇见元素时输出。 非递归算法实现的基本思路:使用堆栈 一、前序遍历 1、递归实现 遍历过程为: 访问根结点; 先序遍历其左子树; 先序遍历其右子树。 void ProOrderTraverse(BiTree tre...

桑凯旋的博客 2万+

线索二叉树的递归与非递归实现 数据结构作业

(1)递归实现二叉树的中序线索化 (2)非递归实现二叉树的中序线索化 (3)实现中序线索二叉树上遍历二叉树

C++ 非递归二叉树创建

非递归实现C++二叉树 Node* creatTree(struct Node *head) void preOrderUnrec(struct Node *head) void inOrderUnrec(struct Node *head) void postOrderUnrec(struct Node *head)

数据结构C++——二叉树的遍历(递归和非递归)及一些简单操作

数据结构与算法分析(C++)——二叉树 文章目录数据结构与算法分析(C++)——二叉树一、前言二、二叉树的一些常见操作①二叉树的存储结构②二叉树的先序遍历③二叉树的中序遍历④二叉树的后序遍历⑤复制二叉树⑤计算二叉树的深度三、完整代码三、总结 一、前言 树的遍历操作需要和栈相结合,虽然C++中有许多关于数据结构的头文件可以直接拿来使用,但对于数据结构的初学者,栈的常见操作、基本原理、代码实现都应该了熟于心。 关于数据结构——栈的文章:链接: 数据结构与算法分析(C++)——栈. 二、二叉树的一些常见操作 ①二

qq_54162207的博客 7689

摩尔线程GPU实战:5分钟搞定AI模型部署(含Docker避坑指南)

本文详细介绍了摩尔线程GPU在AI模型部署中的实战应用,包括环境配置、Docker避坑指南及性能优化技巧。通过5分钟快速部署指南,帮助开发者高效利用摩尔线程GPU进行AI模型推理,特别针对常见兼容性问题提供解决方案,显著提升部署效率。

weixin_28736335的博客 454

数据结构与算法--C++实现二叉树的基本操作

数据结构与算法–C++实现二叉树的基本操作 在学习数据结构与算法这门课中,老师布置了一个关于二叉树的实验作业。实验作业的要求如下所示: 经过了几天的不懈努力(到处学习补知识),终于能够实现二叉树实验。 下面就是该实验的过程,成果图以及代码: 主要内容:主要使用了循环递归的思想,其中还使用了链表,栈与队列的操作。 根据该二叉树图来创建二叉树。(图中的#是表示空结点) 效果图: 创建二叉树: 根据先序遍历的方法,依次输入权值来创建二叉树。 输出中序遍历: 中序遍历(左结点-根节点-右结点)–D G B A

小小城序员的博客 2009

单细胞测序数据读取实战指南:从入门到精通

本文提供了单细胞测序数据读取的实战指南,涵盖从标准10X Genomics格式到通用表达矩阵及RDS文件的读取方法。文章重点解析了数据读取的核心步骤、常见问题解决方案及进阶技巧,旨在帮助用户夯实数据分析基础,确保后续分析流程的准确性。

weixin_29095587的博客 460

TI Sitara PRU可编程实时单元:工业自动化中的硬实时协处理器解析

在嵌入式系统与工业自动化领域,实时性和确定性是核心需求。实时性指系统对外部事件做出响应的可预测时间,确定性则要求响应时间严格一致,不受其他任务干扰。其技术原理通常通过专用硬件或实时操作系统实现,例如采用独立于主CPU的协处理器来处理高精度时序任务。这种设计的技术价值在于,它能将主CPU从高实时性要求的任务中解放出来,专注于复杂业务逻辑,同时确保关键IO操作达到纳秒级延迟和极低抖动。应用场景广泛覆盖伺服电机控制、工业通信协议加速和多接口扩展等。本文聚焦的TI Sitara系列PRU(可编程实时单元),正是此类

weixin_42526068的博客 284

C++使用STL实现二叉树 前、中、后序遍历(非递归)

最近刚学到数据结构的二叉树部分,想用C++实现二叉树的前序、中序、后序遍历 一般二叉树的遍历有两种方法,递归和非递归,递归这里就不说了,网上各个版本都差不多,非递归一般是用栈来实现的,这里主要说一下非递归。 先简单说明一下这 3 种遍历方式有什么不同 —— 对于每种遍历,树中每个结点都需要经过 3 次(对于叶结点,其左右子树视为空子树),但前序遍历在第一次遇到结点时就立即访问,中序遍历是在第二次遇到结点时访问,后序遍历则是第三次访问。 所谓的前序、中序、后序都是以根节点为标准,前序就是先遍历根节点,中序就是

weixin_44161513的博客 1473

Cocos Creator 3D音频定位实战:从原理到沉浸感实现

3D音频定位是游戏开发中实现沉浸感的关键技术,其核心原理基于HRTF(头部相关传输函数)模型,模拟声音在空间中的传播与双耳感知差异。这项技术通过赋予声音空间坐标、距离衰减和方向属性,将音频从背景元素提升为可交互的环境线索,极大增强了虚拟世界的真实感与玩家的空间认知。在工程实践中,开发者需要深入理解声源、听者、衰减曲线与多普勒效应等基础概念,并合理运用音频池、优先级管理与动态混音等技术手段来平衡效果与性能。对于Cocos Creator开发者而言,无论是使用引擎原生的AudioSource组件构建轻量级方案,

weixin_30972263的博客 292

电子设计(1)二极管防电源反接电路

二极管经常用来作电源防反接保护,所需器件少,电路简单。

记得诚 1万+

医疗AI多智能体资源调度:用Python构建高性能MCU资源池

本文介绍了医疗AI服务平台中多智能体资源争用问题的解决方案。作者设计了一个基于MCU(多点控制单元)理念的中央资源调度器,通过三层架构(资源抽象层、调度策略层、执行控制层)实现对GPU、API、数据库等医疗资源的统一管理。系统采用增强版信号量机制处理可计数并发资源,优化令牌桶算法管理速率资源,并支持急诊优先、配额限制、审计合规等医疗场景特殊需求。核心代码提供了带优先级抢占的并发控制和医疗专用令牌桶实现,可有效解决多智能体资源争用导致的优先级混乱、资源利用不均等问题。

AllenLV的博客 3216

【数据结构】二叉树的深度优先遍历DFS和广度优先遍历BFS(含C++递归和非递归方式实现)

讲解了关于二叉树的遍历,涉及深度优先遍历和宽度优先遍历,从递归和非递归两个思路来进行实现。

weixin_50941083的博客 1338

保研考研机试攻略(满分篇):第二章——满分之路上(1)

保研考研机试攻略(满分篇):第二章——满分之路上(1)2.1计算机和基础+2.2进阶背包问题+2.3毛毛虫算法

qq_63349644的博客 1195

非递归遍历二叉树

 二叉树先序、中序遍历。 #include&lt;cstdio&gt; #include&lt;stack&gt; using namespace std; typedef struct btree{ char data; struct btree *ltree,*rtree; }tree,*Tree; //递归先序创建二叉树 void create(Tree &amp;t) { ...

Sea_Sand息禅 276

动态时间规整(Dynamic Time Warping,DTW):让时间序列分析不再枯燥和代码全分析

动态时间规整(DTW)是一种用于比较时间序列相似性的算法,特别适用于处理长度不同或时间轴不对齐的序列。本文介绍了DTW的核心概念,包括其通过非线性对齐解决时间扭曲问题的能力,以及在语音识别、金融分析等领域的应用。通过Python代码示例,演示了如何计算两个模拟时间序列的DTW距离,并可视化最优对齐路径。结果显示,DTW能够有效捕捉序列间的相似模式,即使它们在时间轴上存在偏移或伸缩。该算法通过最小化累积距离来评估相似性,得分越低表明序列间相似度越高。

此星光明博客 162

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

数据结构 -- 树(附C++代码实现,前序,后序,中序遍历,树的深度,包括递归和非递归遍历 附完整C++代码)

二叉树是一种特殊的树结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。结点的度:左右节点各为一个度叶子结点或者终端结点:度为0的结点树的度:结点的最大分支数树的深度(高度)---层数二叉树形态: 空树,根节点,根节点+左子树 根结点+右子树 根+左+右根据树的结点和树的形状,分为几个形态:斜树,满二叉树和完全二叉树。

m0_56350559的博客 925

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

非递归实现二叉树先序、中序、后序和层序遍历

文章目录用非递归的方式实现二叉树的先序遍历用非递归的方式实现二叉树的中序遍历:用非递归的方式实现二叉树的后序遍历:用非递归的方式实现二叉树的层次遍历: 用递归方式实现二叉树先序、中序和后序遍历很简单。 用递归方法解决的问题都能用非递归的方法实现。递归就是利用函数栈来保存信息,如果用自己申请的数据结构来代替函数栈,也可以实现相同的功能。 用非递归的方式实现二叉树的先序遍历 1、申请一个栈stack,然后将头节点压入stack中。 2、从stack中弹出栈顶节点,打印,再将其右孩子节点(不为空的话)先压入s

将~军的博客 1539

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

笔试面试题——二叉树进阶(三)

分享二叉树进阶OJ题

2301_78995005的博客 855

二叉树的创建和各种递归非递归遍历方法研究(一)

先来看看具体代码如下: // BinTree1.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include using namespace std; typedef struct node { char data; struct node* lchild; struct n

471

二叉树的创建以及递归非递归遍历

#pragma once #include&lt;iostream&gt; #include&lt;stdlib.h&gt; #include&lt;assert.h&gt; #include&lt;stack&gt; #include&lt;queue&gt; using namespace std; template&lt;class T&gt; struct BinTreeNode { T...

baidu_37964044的博客 322

C++数据结构之二叉树

之前打算编算法类的程序,但是搞了几次英雄会后,觉得作为一个还在学习阶段的学生,实在是太浪费时间了,并不是没意义,而是我的基础还不牢固啊。所以转变了思路,这个学期打算分别用C++、Python、Java实现数据结构。下个学期再做算法的打算吧。不过Java没学过,可能要一点时间了。

DVD0423的专栏 1360
上一篇: Windows7(旗舰版)下安装SQL Server 2005注意事项及问题解决
下一篇: C++数据结构之二叉树递归操作
Hy_Fighting
博客等级 码龄15年 11粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值