数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)

简介: 数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)

层序遍历

层序遍历可以通过一个队列来实现,其基本过程为:

先根节点入队,然后:

  1. 从队列中取出一个元素;
  2. 访问该元素所指的节点;
  3. 若该元素所指节点的左、右孩子节点非空, 则将其左、右孩子的指针顺序入队。
  4. 循环123的步骤,直到队列为空。

思路图解

代码实现

void LevelOrderTraversal(BinTree BT)
{
  Queue Q;
  BinTree T;
  if (!BT)
  {
    return; //若为空树则直接返回
  }
  Q = CreateQueue(); //创建并初始化队列Q
  Add(Q, BT);
  while (!IsEmptyQ(Q))
  {
    T = DeleteQ(Q);
    printf("%d\n", T->data);  //访问取出来的节点
    //若该元素的左右孩子节点不为空,则依次入队
    if (T->Left)
    {
      AddQ(Q, T->Left);     
    }
    if (T->Right)
    {
      AddQ(Q, T->Right);
    }
  }
}

二叉树遍历的应用

输出二叉树中的叶节点

之前讲过的递归先序遍历二叉树写法很简单,而要输出二叉树中的叶节点,就可以在进行遍历的过程中进行检测,如果为叶节点则输出,否则继续遍历。 叶节点即左孩子节点为空、右孩子节点也为空。

代码实现

void PreOrderPrintLeaves(BinTree BT)
{
  if (BT)
  {
    if (!BT->Left && !BT->Right)
      printf("%d ", BT->data);
    PreOrderPrintLeaves(BT->Left);
    PreOrderPrintLeaves(BT->Right);
  }
}

求二叉树的高度

树是递归定义的,一颗二叉树的高度应该等于左右两颗子树的最大高度+1 求二叉树的高度,利用的是后序遍历的一种程序框架来实现的。

思路图解

代码实现

int PostOrderGetHeight(BinTree BT)
{
  int HL, HR, MaxH;
  if (BT)
  {
    HL = PostOrderGetHeight(BT->Left);   //求左子树的高度
    HR = PostOrderGetHeight(BT->Right);  //求右子树的高度
    MaxH = (HL > HR) ? HL : HR;          //取左右子树的最大高度
    return (MaxH + 1);                   //返回树的高度
  }
  else
  {
    return 0;                            //空树的高度为0
  }
}

二元运算表达式树及其遍历

对上面的表达式树进行三种遍历,可以得到三种不同的访问结果:

试着分别写出上面表达式树前序中序和后序遍历的不同表达式,复习一遍之前讲的树的遍历。



先序遍历可以得到前缀表达式:++a*bc*+*defg


中序遍历可以得到中缀表达式:a+b*c+d*e+f*g


后序遍历可以得到后缀表达式:abc*+de*f+g*+


但需要注意的是:中缀表达式会受到运算符优先级的影响,所以单单这样通过中序遍历得出的中缀表达式是不完全准确的。

解决方法是:在输出左子树之前,先输出一个左括号,左子树结束的时候再输出一个右括号。

由两种遍历序列确定二叉树

已知三种遍历中的任意两种遍历序列,能否唯一确定一颗二叉树呢?

答案是:两种遍历序列中,必须要有一种是中序遍历才能够唯一确定一颗二叉树

假设没有中序,看下面两个序列:

先序遍历序列:A B

后序遍历序列:B A

像这样一组简单的序列,只有先序遍历序列和后序遍历序列的情况下,就有两颗是符合的二叉树,其中根节点是容易确定的,先序的第一个节点就是根,后序的最后一个节点就是根;但是左右节点是不好区分的,所以就导致了只有先序序列和后序序列的情况下没法唯一地确认一颗二叉树。


下面就来看看,已知先序序列和中序序列,怎么样来确定一颗二叉树。

思路:

  1. 根据先序遍历序列第一个节点确定根节点;
  2. 根据根节点在中序遍历序列中分割出左右两个子序列;
  3. 对左子树和右子树分别递归使用相同的方法继续分解。


举个例子清晰一下思路:

先序序列: abcdefghij

中序序列: cbedahgijf

所以最终通过先序遍历序列和中序遍历序列唯一确定的二叉树就为:


end



目录
相关文章
|
4月前
|
存储 监控 JavaScript
基于布隆过滤器的 Node.js 算法在局域网电脑桌面监控设备快速校验中的应用研究
本文探讨了布隆过滤器在局域网电脑桌面监控中的应用,分析其高效空间利用率、快速查询性能及动态扩容优势,并设计了基于MAC地址的校验模型,提供Node.js实现代码,适用于设备准入控制与重复数据过滤场景。
217 0
|
3月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
254 3
|
3月前
|
机器学习/深度学习 资源调度 算法
遗传算法模型深度解析与实战应用
摘要 遗传算法(GA)作为一种受生物进化启发的优化算法,在复杂问题求解中展现出独特优势。本文系统介绍了GA的核心理论、实现细节和应用经验。算法通过模拟自然选择机制,利用选择、交叉、变异三大操作在解空间中进行全局搜索。与梯度下降等传统方法相比,GA不依赖目标函数的连续性或可微性,特别适合处理离散优化、多目标优化等复杂问题。文中详细阐述了染色体编码、适应度函数设计、遗传操作实现等关键技术,并提供了Python代码实现示例。实践表明,GA的成功应用关键在于平衡探索与开发,通过精心调参维持种群多样性同时确保收敛效率
|
3月前
|
机器学习/深度学习 边缘计算 人工智能
粒子群算法模型深度解析与实战应用
蒋星熠Jaxonic是一位深耕智能优化算法领域多年的技术探索者,专注于粒子群优化(PSO)算法的研究与应用。他深入剖析了PSO的数学模型、核心公式及实现方法,并通过大量实践验证了其在神经网络优化、工程设计等复杂问题上的卓越性能。本文全面展示了PSO的理论基础、改进策略与前沿发展方向,为读者提供了一份详尽的技术指南。
粒子群算法模型深度解析与实战应用
|
3月前
|
机器学习/深度学习 算法 安全
小场景大市场:猫狗识别算法在宠物智能设备中的应用
将猫狗识别算法应用于宠物智能设备,是AIoT领域的重要垂直场景。本文从核心技术、应用场景、挑战与趋势四个方面,全面解析这一融合算法、硬件与用户体验的系统工程。
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习模型、算法与应用的全方位解析
深度学习,作为人工智能(AI)的一个重要分支,已经在多个领域产生了革命性的影响。从图像识别到自然语言处理,从语音识别到自动驾驶,深度学习无处不在。本篇博客将深入探讨深度学习的模型、算法及其在各个领域的应用。
1025 3
|
5月前
|
机器学习/深度学习 人工智能 算法
AI-Compass 强化学习模块:理论到实战完整RL技术生态,涵盖10+主流框架、多智能体算法、游戏AI与金融量化应用
AI-Compass 强化学习模块:理论到实战完整RL技术生态,涵盖10+主流框架、多智能体算法、游戏AI与金融量化应用
|
5月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
175 1
|
4月前
|
算法 数据可视化
matlab版本粒子群算法(PSO)在路径规划中的应用
matlab版本粒子群算法(PSO)在路径规划中的应用
|
5月前
|
存储 监控 算法
公司员工泄密防护体系中跳表数据结构及其 Go 语言算法的应用研究
在数字化办公中,企业面临员工泄密风险。本文探讨使用跳表(Skip List)数据结构优化泄密防护系统,提升敏感数据监测效率。跳表以其高效的动态数据处理能力,为企业信息安全管理提供了可靠技术支持。
140 0

热门文章

最新文章