二叉树遍历(前序,中序,后序)

二叉树的后序遍历(C语言) 首先我们从两个方面讲解二叉树的后序遍历(递归+迭代) 一.二叉树的后序遍历.(递归) 思想: 首先我们从二叉树的根节点开始先遍历其左孩子,①接着同样继续遍历其左孩子的左孩子,直到某个左孩子节点的左孩子为NULL时,②开始遍历其右孩子,如果其为NULL则访问该节点的值域,并返回其双亲节点重复第二步的操作,如果其不为NULL则以该节点为根节点重复第一步的操作.直到访问完所有节点时结束递归. 代码: void BTreePostOrder(struct TreeNode* root,int* arry 阅读详情
#include <stdio.h>
#include <stdlib.h>

#define  MAXSIZE 20
//二叉树结点的结构体表示形式
typedef struct BitNode
{
    char    data;
    struct BitNode* left,*right;
}BitTree;

//栈的结构体表示形式
typedef struct stackelem
{
    BitTree* a[MAXSIZE];
    int top;
}Stack;

//队列的结构体的表示形式
typedef struct queueelem
{
    BitTree* b[MAXSIZE];
    int front,rear;
}Queue;

//创建二叉树,利用递归的方法
//按前序次序输入。 如 A # #(#表示空树)
BitTree* Create()
{
    char ch;
    scanf("%c",&ch);
    getchar();    //吃掉空格符
    if (ch=='#')
    {
        return NULL;
    }
    else
    {
        BitTree* btree=(BitTree*)malloc(sizeof(BitTree));
        if (NULL==btree)
        {
            return NULL;
        }
        btree->data=ch;
        btree->left=Create();
        btree->right=Create();
        return btree;
    }
}

//前序遍历,递归的方法
void Preorder(BitTree* bt)
{
    if (NULL!=bt)
    {
        printf("%c ",bt->data);
        Preorder(bt->left);
        Preorder(bt->right);
    }
}

//前序遍历的非递归实现
/*
 思想:利用栈来实现;根结点进栈,之后栈非空,弹出,接着根节点的右结点进栈,之后,左节点进栈;接着,弹出栈顶元素(输出),
 此结点的右结点进栈,之后左节点进栈,弹出栈顶元素(输出)...一直这样下去,直到栈为空。
 */
void Preorder2(BitTree* bt)
{
    BitTree* p;
    Stack st;
    st.top=-1;
    if (NULL==bt)
    {
        return;
    }
    else
    {
        st.top++;
        st.a[st.top]=bt;
        while (st.top!=-1)
        {
            p=st.a[st.top];
            st.top--;
            printf("%c ",p->data);
            if (p->right!=NULL)
            {
                st.top++;
                st.a[st.top]=p->right;
            }
            if (p->left!=NULL)
            {
                st.top++;
                st.a[st.top]=p->left;
            }
        }
    }
}

//中序遍历,递归实现
void Inorder(BitTree* bt)
{
    if (NULL!=bt)
    {
        Inorder(bt->left);
        printf("%c ",bt->data);
        Inorder(bt->right);
    }
}

//中序遍历,非递归实现
/*
 思想:利用栈。从根节点开始,循环,只要有左子节点则进栈,直到左子节点为空。接着弹出栈顶输出,判断该结点是否有右子节点,
 若有则进栈,若没有继续弹栈。有右子节点的情况,判断该节点是否有左子节点,有则进栈,直到左子节点为空;若该右子节点没有
 左子节点,则弹栈;判断弹出的节点,是否有右子节点,若有则进栈,没有继续弹栈;接着又要判断刚进栈的这个节点,是否有左子节点,
 有则进栈,没有则继续弹栈。重复下去....
 栈空,是判定条件。
 */
void Inorder2(BitTree* bt)
{
    BitTree* p,*q;
    Stack st;
    st.top=-1;
    if (NULL==bt)
    {
        return;
    }
    else
    {
        while (bt!=NULL)
        {
            st.top++;
            st.a[st.top]=bt;
            bt=bt->left;
        }
        while (st.top!=-1)
        {
            p=st.a[st.top];
            st.top--;
            printf("%c ",p->data);
            while ( p->right!=NULL )
            {
                st.top++;
                st.a[st.top]=p->right;
                q=p->right;
                while (q->left!=NULL)
                {
                    st.top++;
                    st.a[st.top]=q->left;
                    q=q->left;
                }
                break;
            }
        }
    }
}

//后序遍历,递归实现
void Postorder(BitTree* bt)
{
    if (bt!=NULL)
    {
        Postorder(bt->left);
        Postorder(bt->right);
        printf("%c ",bt->data);
    }
}

//后序遍历,非递归实现
/*
 算法思想:利用栈来实现。从根结点开始,只要左子节点非空,则进栈,直到左子节点为空为止。取出栈顶元素(只是取,并非弹栈),判断
 1:取出的栈顶元素是否有右子节点,或者右子节点是否被访问过,若满足条件(无右子节点,或者右子节点被访问过),则输出该结点,
 同时弹栈,并且记录下该访问的节点。
 2:取出的栈顶元素,若有右子节点,且未被访问过,则指针继续移动到右子节点,重复一开始是否又左子节点的判断。
 */
void Postorder2(BitTree* bt)
{
    Stack st;
    st.top=-1;
    BitTree* t;
    do
    {
        while (bt!=NULL)
        {
            st.top++;
            st.a[st.top]=bt;
            bt=bt->left;
        }
        t=NULL;
        while (st.top!=-1)
        {
            bt=st.a[st.top];
            if (bt->right==t)  //t:表示为null,或者右子节点被访问过了。
            {
                printf("%c ",bt->data);
                st.top--;
                t=bt;  //t记录下刚刚访问的节点
            }
            else
            {
                bt=bt->right;
                break;
            }
        }
    } while (st.top!=-1);
}

//求二叉树的高度,递归实现
int Height(BitTree* bt)
{
    int depth1,depth2;
    if (NULL==bt)
    {
        return 0;
    }
    else
    {
        depth1=Height(bt->left);
        depth2=Height(bt->right);
        if (depth1>depth2)
        {
            return (depth1+1);
        }
        else
        {
            return (depth2+1);
        }
    }
}

//层次遍历二叉树,用队列来实现
void TraversalOfLevel(BitTree* bt)
{
    Queue q;
    q.front=q.rear=0;
    if (bt!=NULL)
    {
        printf("%c ",bt->data);
    }
    q.b[q.front]=bt;
    q.rear=q.rear+1;
    while (q.front<q.rear)
    {
        bt=q.b[q.front];
        q.front=q.front+1;
        if (bt->left!=NULL)
        {
            printf("%c ",bt->left->data);
            q.b[q.rear]=bt->left;
            q.rear=q.rear+1;
        }
        if (bt->right!=NULL)
        {
            printf("%c ",bt->right->data);
            q.b[q.rear]=bt->right;
            q.rear=q.rear+1;
        }
    }
}

int main()
{
    BitTree* btr=Create();
    printf("前序遍历:递归和非递归实现:\n");
    Preorder(btr);
    printf("\n");
    Preorder2(btr);
    printf("\n");
    printf("中序遍历:递归和非递归实现:\n");
    Inorder(btr);
    printf("\n");
    Inorder2(btr);
    printf("\n");
    printf("后序遍历:递归和非递归实现:\n");
    Postorder(btr);
    printf("\n");
    Postorder2(btr);
    printf("\n");
    printf("二叉树的高度:\n");
    int Hgt=Height(btr);
    printf("%d \n",Hgt);
    printf("层次遍历二叉树:\n");
    TraversalOfLevel(btr);
    printf("\n");
    return 0;
}

/*  测试数据:
 d b a # # c # # f e # # g # #
 前序遍历:递归和非递归实现:
 d b a c f e g
 d b a c f e g
 中序遍历:递归和非递归实现:
 a b c d e f g
 a b c d e f g
 后序遍历:递归和非递归实现:
 a c b e g f d
 a c b e g f d
 二叉树的高度:
 3
 层次遍历二叉树:
 d b f a c e g

*/
已知中序和后序,求二叉树的前序遍历 【问题描述】 给定二叉树节点个数以及其中序遍历和后序遍历,求其前序遍历。 【输入形式】 共三行。 第一行是一个正整数N,表示节点个数。 第二行共N个正整数,表示二叉树的中序遍历。 第三行共N个正整数,表示二叉树的后序遍历。 【输出形式】 共一行,输出前序遍历。 【样例输入】 10 3 6 7 4 5 9 10 2 8 1 3 7 6 5 10 9 4 8 1 2 【样例输出】 2 4 6 3 7 ... 阅读详情

相关推荐

二叉树的遍历(七种方法)

本章主要通过运用递归与非递归方法分别对二叉树进行遍历 主要分先序遍历、中序遍历、后序遍历以及层次遍历四种情况进行讨论

AIGC 1万+

数据结构-树-二叉树遍历完整可执行代码(递归/非递归)

数据结构-树-二叉树遍历完整可执行代码(递归/非递归) mark:有篇博客写的不错,关于非递归算法描述很详细,先记录了。http://www.cnblogs.com/dolphin0520/archive/2011/08/25/2153720.html #include #include #define MAXSIZE 20 //二叉树结点的结构体表示形式 type

Colin丶 4386

Github多人协作

最近有门课程需要几个人一起开发一个项目,此前我们基本都是单干的,多人合作意味着需要及时将我们每个人的代码进行合并,U盘传文件这种方式太慢了,效率不行,而且没法解决两个人同时修改一个文件的问题,这次我们就尝试使用Github来协助开发。下面就来记录一下这次开发遇到的一些问题和解决的方法。 Git的安装 从官网下载最新版按照默认安装即可。 此处不多加说明。 Git常用命令 在此放上一...

yzr1216的博客 1万+

二叉树的递归遍历

递归遍历分为先序遍历,后序遍历,中序遍历,只要理解了一个那么就都理解了

a4364634611的博客 7030

Vue3项目实战:集成h265webjs打造高性能Web端H.265播放器

本文详细介绍了如何在Vue3项目中集成h265webjs库,构建高性能的Web端H.265播放器。通过封装播放器管理模块、利用Vue3组合式API优雅管理生命周期,并提供了从环境准备、核心集成到进阶优化的完整实战指南,有效解决了浏览器原生不支持H.265解码的难题,显著降低视频流带宽占用。

weixin_29016833的博客 364

告别电源纹波!手把手教你用UCC28019设计一个高效率PFC模块(附完整原理图与BOM清单)

本文详细介绍了如何使用UCC28019设计高效率PFC模块,解决电源纹波问题。通过优化补偿网络、关键元器件选型及PCB布局,实现功率因数提升至0.99以上,降低输入电流谐波。附完整原理图与BOM清单,适用于电赛等快速开发场景。

weixin_42652674的博客 336

数据结构 --- c语言递归法遍历二叉树

二叉树的单一个体 - - -> 一个节点、两个指针,结构体的定义和双向链表类似 二叉树可以存任何类型的数据:这里选择存char类型数据 二叉树的结构体描述 #include <stdio.h> #include <stdlib.h> #include <assert.h> typedef struct Node { char data; //顶点数据 struct Node* LChild; //左子树的指针 struct No...

weixin_60569662的博客 1366

Ubuntu Server 22.04.5系统安装教程

该教程主要是演示在服务器上安装Ubuntu server 22.04系统的详细步骤,主要包含,安装系统前的准备(镜像的下载,启动盘的制作),安装系统时的语言选择,网络设置,切换镜像源(可根据实际需求来配置,本文使用清华镜像源),手动分区,用户设置,ssh服务安装等。以上就是关于Ubuntu Server 22.04系统安装的详细过程。

逆水行舟,不进则退。 7763

二叉树的前序,中序,后序遍历

前序遍历:根节点->左子树->右子树(根->左->右) 中序遍历:左子树->根节点->右子树(左->根->右) 后序遍历:左子树->右子树->根节点(左->右->根) 技巧:看根节点打印的顺序,出现在前还是中,后. 前序遍历:GDAFEMHZ 中序遍历:ADEFGHMZ 后序遍历:AEFDHZMG 前序: 第一步:打印该节点(再三考虑还是把访问根节点这句话去掉了) 第二步:访问左子树,返回到第一步(注意:...

一蓑烟雨任平生 1万+

OpenStack ussuri 私有云平台搭建企业级实战

openstack是一个云操作系统,这个操作系统控制着数据中心中的计算,存储和网络资源。所有这些资源的管理都是通过API来来实现的,并且管理资源都有相应的认证机制。在openstack中有一个叫做dashboard的仪表盘,这个仪表盘通过web界面可以管理这些在DC中的资源。除了能提供IaaS功能外,你还可以使用orchestration,错误管理和服务管理等服务来确保应用的高可用性。

悦分享 2340

AI测试:手把手教你用AI做Web自动化测试「喂饭教程」

本文介绍了基于MCP协议和使用 mcp-use + playwright-mcp 构建智能Web自动化测试框架的实践方法。通过整合大语言模型的理解能力与测试工具可靠性,该方案支持用自然语言描述测试流程,自动转换为可执行的测试步骤,提升测试效率,支持复杂场景和多步骤流程,为自动化测试提供了新思路。

blues_C的博客 1283

如何判断二叉树的前序,中序,后序遍历

文章目录前言一、如何判断二叉树的前序,中序,后序遍历?二、已知二叉树的前序遍历和中序遍历,如何得到它的后序遍历?三、程序实现总结 前言 最近复习题中看到二叉树,对于它的前序,中序,后序遍历的判断有些模糊,后经查阅资料,将学习过程记录在博客中。 提示:以下是本篇文章正文内容 一、如何判断二叉树的前序,中序,后序遍历? 对一棵二叉树进行遍历,我们可以采取3中顺序进行遍历,分别是前序遍历、中序遍历和后序遍历。这三种方式是以访问父节点的顺序来进行命名的。假设根节点是N,左节点是L,右节点是R,那么对应的访问遍

bug的博客 1万+

2023 ICRA《Visual Language Maps for Robot Navigation》阅读笔记

视觉语言导航可以使用预先训练的现有的视觉语言模型来将图像与对象目标的自然语言描述相匹配,但它与绘制环境的过程仍然脱节,缺乏经典几何地图的空间精度。为了解决这个问题,我们提出了VLMaps,这是一种空间地图表示,它将预训练的视觉语言特征与物理世界的3D重建直接融合在一起。VLMaps可以使用标准探索方法从机器人上的视频馈送中自主构建,并在没有额外标记数据的情况下实现地图的自然语言索引。具体来说,当与大型语言模型(LLM)相结合时,VLMaps可以用于。

qq_44100524的博客 1991

二叉树的前序、中序、后序遍历

前、中、后序遍历规律 根据其中两个遍历顺序确定二叉树

weixin_62803673的博客 2069

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

二叉树的三种遍历——前序、中序、后序遍历

二叉树的三种遍历: 前序/先序遍历:读取顺序依次为:根-左-右 顺序为:ABDGHCEIF 中序遍历:读取顺序依次为:左-根-右 顺序为:GDHBAEICF 后序遍历:读取顺序依次为:左-右-根 顺序为:GHDBIEFCA 对于已知条件: 已知中序和后序:有后序二叉树的最后一个结点为根结点,中序二叉树的根的左右为左子树和右子树,另,可对分解进行排序,如下, 中序:DCEF A K...

时间 7803

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

二叉树的前序、中序和后序遍历介绍及案例

文章目录介绍 介绍

weixin_47306988的博客 2012

二叉树的遍历(前序、中序、后序、已知前中序求后序、已知中后序求前序)

二叉树的遍历(前序、中序、后序、已知前中序求后序、已知中后序求前序) 之前的一篇随笔(二叉树、前序遍历、中序遍历、后序遍历)只对二叉树的遍历进行了笼统的描述,这篇随笔重点对前、中、后序的遍历顺序进行分析 二叉树的遍历 二叉树的深度优先遍历可细分为前序遍历、中序遍历、后序遍历,这三种遍历可以用递归实现(本篇随笔主要分析递归实现),也可使用非递归实现的 前序遍历:根节点->左子树->右子树(根->左->右) 中序遍历:左子树->根节点->右子树(左-..

u010029439的博客 1530

二叉树的前序、中序、后序遍历(附java代码)

前序遍历的顺序是根左右,中序遍历的顺序是左根右,后序遍历的顺序是左右根;前序、中序、后序遍历就是看访问根节点的位置。

小白的出道之路 5100

二叉树的前序、中序和后序遍历

基于递归算法的二叉树遍历简介(C++)

m0_63730174的博客 2816

算法1—递归实现二叉树的前序、中序、后序遍历

仅个人理解,计算机特点就是处理速度级快,为了不遗漏、不重复处理二叉树的每一个节点,总得按照某种顺序吧,前辈们发明了处理二叉树节点的顺序:前序遍历、中序遍历、后续遍历,经过时间的检验还是可以的。二叉树的前序、中序、后序遍历的作用都是不遗漏且不重复地处理二叉树的每一个结点。

龚小帅的博客 2716

记录自己是怎么认识二叉树的前序、中序、后序遍历

偶然发现曾经了解的知识忘记了,现在用最朴素的语言写下来记录自己是怎么懂的。 首先 最重要的就是3个遍历顺序: 前序:根节点->左子树->右子树 中序:左子树->根节点->右子树 后续:左子树->右子树->根节点 这么看肯定很迷茫,下面以一个例子加深理解: 现在一步步写出3种遍历结果(笔者自己的理解语言逻辑) 前序遍历:GDAFE MHZ: 要明确根-左-右 这个顺序,就是先写根,再写左边,最后再写右边。首先是根,G就是根不用多说,写下G。随后就是往左边就是D这条分支,D

weixin_43980047的博客 3691

二叉树前序、中序、后序遍历相互求法

今天来总结下二叉树前序、中序、后序遍历相互求法,即如果知道两个的遍历,如何求第三种遍历方法,比较笨的方法是画出来二叉树,然后根据各种遍历不同的特性来求,也可以编程求出,下面我们分别说明。 总结一下三种遍历方式的特征: 前序:开头是头结点 中序:根据头结点划分左右子树的元素 后序:末尾是头结点 首先,我们看看前序、中序、后序遍历的特性: 前序遍历: 1.访问根节点 2.前序

尤教授的博客 8万+
上一篇: 二叉树的基本运算
下一篇: 会场安排问题
Duke的专栏
博客等级 码龄9年 219粉丝 146原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值