二叉树的前序,中序,后序,BFS

二叉树前、中、后序,广度遍历bfs、深度遍历dfs(递归+非递归) 思路: 二叉树的建立采用的是递归的思想:给定一个指向根节点的指针,然后递归调用ceate()函数,自动生成一个二叉树。就像是在地上挖了个坑(根节点),然后他会拿着铲子(create函数)按照一定的规则自动挖一个很大的洞穴(二叉树)出来。当然挖坑前需要先定义每个洞长什么样(定义节点结构)。 递归就是有去(递去)有回(归来)。规模大转化为规模小是核心思想。 struct Tree{ T... 阅读详情
#include <stdio.h>
#include <stdlib.h>
typedef char BiElemType;

typedef struct BiTNode{
    BiElemType data;
    BiTNode *lchild;
    BiTNode *rchild;
}BiTNode,*BiTree;

//辅助队列,用于辅助建树
typedef struct tag{
    BiTNode *p;//树某一个结点的地址值
    tag *pnext;
}tag_t,*ptag_t;

#define MaxSize 6
#define ElementType BiTree

typedef struct LinkNode{
    ElementType data;
    LinkNode *next;
}LinkNode,*LinkList;

typedef struct {
    LinkNode *front,*rear;//链表头,链表尾
}LinkQueue;

void InitQ(LinkQueue &Q){
    Q.front=Q.rear=(LinkNode*) malloc(sizeof(LinkNode));
    Q.front->next=NULL;
}

void EnQueue(LinkQueue &Q,ElementType ele){
    LinkNode *NewNode=(LinkNode *)malloc(sizeof(LinkNode));
    NewNode->data=ele;
    Q.rear->next=NewNode;
    Q.rear=Q.rear->next;
    Q.rear->next=NULL;

}

void DeQueue(LinkQueue &Q,ElementType &DelEle){
    LinkNode *DelNode;

    //判断队列是否为空
    if(Q.front!=Q.rear){
        DelNode=Q.front->next;
        DelEle=DelNode->data;
        Q.front->next=DelNode->next;
        //链表只剩一个节点的时候使Q.rear=Q.front
        if(Q.rear==DelNode)
            Q.rear=Q.front;
        free(DelNode);
    }
    else{
        printf("the Queue is empty");
    }
}

bool isEmpty(LinkQueue Q){
    if(Q.front==Q.rear){
        return true;
    }
    else
        return false;
}

//建树abcdefghij
void BuildTag(BiTree root,ptag_t &Q){
    Q=(ptag_t) malloc(sizeof(tag));
    Q->p=root;
    Q->pnext=NULL;
    ptag_t newNode;
    ptag_t rear=Q;
    int ele=65;//a的码值
    for (int cnt = 0; cnt < 10; ++cnt) {
        newNode=(ptag_t) malloc(sizeof (tag));
        //申请空间,并初始化为0
        newNode->p=(BiTNode*) calloc(1,sizeof (BiTNode));
        newNode->p->data=ele;
        ele++;
        rear->pnext=newNode;
        newNode->pnext=NULL;
        rear=rear->pnext;
    }
}

void BuildTree(BiTree &root,ptag_t &Q){
    //cur为当前要创建左右子树的节点
    tag* cur=Q->pnext;
    //ptr指向将要插入到父节点的子节点
    tag* ptr=Q->pnext->pnext;
    root=cur->p;
    BiTree curBiNode=root;
    while(ptr){
        //如果当前父亲节点的左边孩子为空,那么向左边插入
        if(NULL==cur->p->lchild){
            curBiNode->lchild=ptr->p;
            ptr=ptr->pnext;
        }//左边孩子不为空那么向右边孩子插入
        else if(NULL==cur->p->rchild){
            curBiNode->rchild=ptr->p;
            ptr=ptr->pnext;
        }
            //都已满那么进行下一个父亲节点左右孩子的创建
        else{
            cur=cur->pnext;
            curBiNode=cur->p;
        }
    }
}

void PreOrder(BiTree biTree){
    if(biTree){
        printf("%c",biTree->data);
        PreOrder(biTree->lchild);
        PreOrder(biTree->rchild);
    }
}

void InOrder(BiTree biTree){
    if(biTree){
        InOrder(biTree->lchild);
        printf("%c",biTree->data);
        InOrder(biTree->rchild);
    }
}

void PostOrder(BiTree biTree){
    if(biTree){
        PostOrder(biTree->lchild);
        PostOrder(biTree->rchild);
        printf("%c",biTree->data);
    }
}

void BFS(BiTree biTree){
    LinkQueue Q;
    InitQ(Q);
    BiTNode *p=biTree;
    //树根入队
    EnQueue(Q,biTree);
    ElementType delEle;
    while (!isEmpty(Q)){
        p=Q.front->next->data;
        DeQueue(Q,delEle);
        printf("%c",delEle->data);
        if(p->lchild){
            EnQueue(Q,p->lchild);
        }
        if(p->rchild){
            EnQueue(Q,p->rchild);
        }

    }

}
int main() {
    BiTree root;
    ptag_t Q;
    BuildTag(root,Q);
    BuildTree(root,Q);

    InOrder(root);
    printf("\nbfs:\n");
    BFS(root);

    return 0;
}

手把手教你用Siemens EDA破解工具搞定PADs VX2.7安装与卡死问题 本文详细介绍了如何使用Siemens EDA工具解决PADs VX2.7的安装与卡死问题。从License配置到性能调优,提供全面的解决方案,帮助工程师高效完成电子设计自动化任务。特别针对常见的卡顿现象,给出了输入法兼容性调整、图形性能优化等实用技巧。 阅读详情

相关推荐

DSP配置I2C通讯(非IO口软件模拟时序)

dsp即数字信号处理器,是一种广泛应用的嵌入式处理器,主要应用是实时快速地实现各种数字信号处理算法,目前,国际主要的dsp供应商是ti公司,其tms32系列产品占据了dsp市场近一半的份额,本文以TMS320F28377D为例,使用ti公司dsp开发工具ccs10.1配置i2c模块。 写这篇文章的缘由,因为市面上很多DSP其实内部是具有硬件I2C接口的,但由于网络上大部分资料和例程都是利用IO口模拟I2C时序进而实现I2C通讯的。给很多想学习硬件I2C通讯的小伙伴带来了困难。 下面先介绍一下配置步骤 1.E

weixin_44387442的博客 5545

【算法】二叉树的遍历指南(前序、中序、后序、层序、BFS、DFS)

【算法】一文带你复习⭐二叉树⭐的遍历,前序遍历,中序遍历,后序遍历,层序遍历,DFS,BFS……

可可卷的博客 4182

codesys【modbusRTU】主站

【代码】modbusRTU【codesys】

cfqq1989的博客 4374

多叉树的前序遍历_【算法】二叉树、N叉树先序、中序、后序、BFS、DFS遍历的递归和迭代实现记录(Java版)...

本文总结了刷LeetCode过程中,有关树的遍历的相关代码实现,包括了二叉树、N叉树先序、中序、后序、BFS、DFS遍历的递归和迭代实现。这也是解决树的遍历问题的固定套路。一、二叉树的先序、中序、后序遍历1、递归模板(1)先序1 public voidpreorder(TreeNode root) {2 if (root == null) {3 return;4 }5 res....

weixin_35705784的博客 775

大众点评商家及评分数据(2012-2025)

大众点评及商家评分数据库全面覆盖全国范围内多个城市的商户信息,涵盖餐饮、购物、休闲娱乐等多个消费领域,包含商家基础信息、地理坐标、分类体系、经营状态、用户评价、消费水平及服务设施等共计28个字段。

Sunny9qx的博客 2694

SerDes系列之FFE均衡技术

FFE的基本结构可以在RX侧或TX侧实现,其基本工作原理相同:它通过从同一信号源应用适当的延迟来产生多径信号,然后对它们进行线性缩放和组合以消除信道ISI。

一只豌豆象的博客 4243

【算法总结】你真的掌握了二叉树的遍历嘛(1)

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从哪里入手去学习,对此我整理了一些资料如果你熟练掌握以下列出的知识点,相信将会大大增加你通过前两轮技术面试的几率!这些内容都供大家参考,互相学习。①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!轮技术面试的几率!这些内容都供大家参考,互相学习。

2301_82101470的博客 837

流体动力学仿真软件:XFlow_(20).案例研究:声学仿真

在流体动力学仿真软件中,声学仿真是一个重要的应用领域。通过数值模拟,工程师和科研人员可以预测和分析流体系统中的声学现象,如气动噪声、声波传播和声场分布。这些仿真结果对于优化设计、降低噪声水平和提高系统性能具有重要意义。本节将详细介绍如何在流体动力学仿真软件中进行声学仿真,包括声学模型的选择、参数设置、后处理分析等内容,并通过具体的案例来说明这些步骤。

kkchenjj的博客 902

二叉树的五种遍历:前序,中序,后序,非递归方法(栈),bfs+队列)

二叉树的五种遍历: 递归遍历:前序,中序,后序,非递归方法(栈); 层次遍历(bfs+队列); #include &lt;vector&gt; #include &lt;iostream&gt; #include &lt;stack&gt; #include &lt;queue&gt; using namespace std; struct BitNode { int data;...

pxlsdz的博客 957

知识库构建革命:基于Agent的智能检索系统设计

本文聚焦“基于Agent的智能检索系统”这一前沿技术,系统讲解其设计逻辑、核心技术与落地方法。我们将覆盖从基础概念(如Agent如何“理解”知识)到实战代码(如何用Python搭建原型系统)的全链路内容,帮助技术开发者、企业知识管理负责人理解这一技术为何能颠覆传统知识库。本文将按“问题引入→核心概念→技术原理→实战落地→未来趋势”的逻辑展开:先用“老图书馆的困境”故事引出传统知识库的问题;再用“智能图书管理员”类比解释Agent如何革新检索;接着拆解NLP、对话管理、知识推理等核心技术;

AI智能探索者的博客 728

使用Python,OpenCV查找图像中的最亮点

这篇博客展示了,为什么在图像中找到最亮的点之前应用高斯模糊是至关重要的。 通过应用高斯模糊,可以将每个给定半径内的像素平均在一起。取平均值可以去除高频噪声,否则会影响cv2.minMaxLoc函数的结果。 一定要研究高斯模糊半径的恰当值。如果取值太小,将会减轻平均值的影响,而忽略了更大、更亮的区域。但是如果半径太大,将无法探测到小的明亮区域。

qq_40985985的博客 3809

链式二叉树

1.链式二叉树的四种遍历;2.了解BFS与DFS。

wangjiushun的博客 905

昇腾AI原生创新算子挑战赛(S1赛季)复盘-LessEqual算子

【代码】昇腾AI原生创新算子挑战赛(S1赛季)复盘-LessEqual算子。

william_myq的博客 507

二叉树遍历问题模板

二叉树算法模板

weixin_47520540的博客 1719

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

JAVA 二叉树的遍历 递归和非递归 (DFS(前、中、后序) BFS)

JAVA二叉树的遍历 递归和非递归 (DFS(前、中、后序) BFS) 先建立一个节点类 package mianShi_test.binaryTree; public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 建立一个二叉...

struggle_go的博客 532

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

二叉树/递归/回溯/动规的框架思维

而前序位置本身其实没有什么特别的性质,之所以很多题都是在前序位置写代码,实际上是因为我们习惯把那些对前中后序位置不敏感的代码写在前序位置罢了。,每个节点都有唯一的前中后序位置,在递归的过程中,需要在进入/离开/切换节点的时候执行核心代码,就把核心代码放到对应的前中后序位置!如果采用遍历,也就是回溯的方法,其思路是遍历一遍二叉树,用一个外部变量记录每个节点所在的深度,取最大值就可以得到最大深度。如果采用分解,也就是动规的方法,其思路就是二叉树的最大深度=max(左子树的最大深度,右子树的最大深度)+1。

weixin_51076267的博客 1446

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

代码随想录Day14|二叉树遍历(递归+迭代)|前中后dfs层bfs

二叉树遍历

qq_43250021的博客 186

LeetCode数据结构_C语言题解系列-树

LeetCode数据结构_C语言题解系列-树

wzbbbb的博客 215

二叉树的四种遍历方法

二叉树的四种遍历方法,反转二叉树,获取二叉树的最大深度

abc369_7的博客 918

【算法总结】你真的掌握了二叉树的遍历嘛(2)

前序遍历顺序:[1 2 4 5 3 6]中序遍历顺序:[4 2 5 1 3 6]后序遍历顺序:[4 5 2 6 3 1]层次遍历使用 BFS 实现,利用的就是 BFS 一层一层遍历的特性;而前序、中序、后序遍历利用了 DFS 实现。前序、中序、后序遍只是在对节点访问的顺序有一点不同,其它都相同。递归实现前序,中序,后序遍历① 前序5}② 中序5}③ 后序5}1. 非递归实现二叉树的前序遍历。

2301_82101470的博客 895

tinyxml2遍历所有节点_Python实现二叉树的遍历

Outline:二叉树概念二叉树遍历(前序、中序、后序、宽度优先遍历)的迭代实现和递归实现;二叉树的深度,二叉树到leaf的所有路径。树(Tree)是一种抽象数据类型(ADT),是由n(n>=0)个有限节点来模拟的一个具有树状结构性质的数据集合。二叉树 Binary Tree至少有一个节点(根节点)每个节点最多有2棵子树(左右子树)(即每个节点的度小于3)左子树和右子树是有顺序的,次序不能任...

weixin_39860064的博客 253

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

二叉树通用的遍历树的策略有深度优先搜索(DFS),宽度优先搜索(BFS)或者叫广度优先搜索。 遍历方式有:前序遍历,中序遍历,后序遍历。 前序遍历:根节点→左子树→右子树。 中序遍历:左子树→根节点→右子树。 后序遍历:左子树→右子树→根节点。 二叉树的定义: Struct TreeNode { int val; //数据域 TreeNode * left; //指针域 TreeNode * right; //指针域 TreeNode(

blue_coffeei的博客 228

“非递归” 实现二叉树的“前序、中序、后序、层序”遍历

相信学过或是了解过二叉树的朋友都知道,他的前序、中序、后序遍历使用递归法实现非常简单,那么如果使用非递归的方式来解,也就是使用迭代来解,你还能将他拿下么?实际上一点都不难,往下看~

CYK_byte的博客 3234

第六章:二叉树的层序遍历

int val;Tree* left;

ZH1352135124的博客 319

遍历二叉树(前序、中序、后序)(JAVA实现)

今天做leetcode上碰到了这个知识点,正好写个帖子来记录一下。 首先,树的结构 public class TreeNode { * int val; //节点的值 * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } 一、前序遍历(中 左 右) 前序遍历(DLR,lchild,data,rchild),是二叉树遍历的一种,也叫做先根遍历、先序遍历、前序周游,可记做根左右。前

weixin_43916896的博客 334

【数据结构-5】单链表的实现

单链表,具体来说是单向的、不带头的、不循环的链表。链表由一个一个节点组成,每个节点分为数据域和指针域,数据域存放数据,指针域存放下一节点的地址。这样,就可以根据指针域中的地址找到下一个节点,节点就串起来了构成了单链表。

weixin_44218929的博客 187
下一篇: 408 14年41题wpl
丶qn
博客等级 码龄6年 1粉丝 10原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值