数据结构和算法学习记录——二叉树的非递归遍历(中序遍历、先序遍历、后序遍历)

简介: 数据结构和算法学习记录——二叉树的非递归遍历(中序遍历、先序遍历、后序遍历)

二叉树的非递归遍历运用到堆栈

中序遍历

循环的思路是

  1. 遇到一个节点,就把它压栈,并去遍历它的左子树。
  2. 当左子树遍历结束之后,从栈顶弹出这个节点并访问它。
  3. 然后按其右指针再去按中序的遍历循环去遍历该节点的右子树。

代码实现

void InOrderTraversal(BinTree BT)
{
  BinTree T = BT;
  Stack S = CreatStack();  //创建并初始化堆栈S
  while (T || !IsEmpty(S))        //节点和栈都为空时才停止循环
  {
    while (T)                   //一直向左并将沿途节点压入堆栈
    {
      Push(S, T);       
      T = T->Left;
    }
    if (!IsEmpty(S))            //当遇到左子树为空时,进行出栈
    {
      T = Pop(S);             //弹出栈顶元素
      printf("%5d", T->data); //访问栈顶元素
      T = T->Right;           //转向右子树
    }
  }
}

思路图解

从中序非递归遍历的代码上,可以将压栈时看做是第一次经过节点,将出栈是看做是第二次经过节点。所以结合之前学的递归遍历, 中序的非递归遍历代码中,才会在出栈时(即第二次经过节点时)访问节点。

所以要写出先序的非递归遍历就比较简单了:

先序遍历

将访问放在第一次经过节点时,就变成了先序的非递归遍历代码了。

代码实现

void PreOrderTrversal(BinTree BT)
{
  BinTree T = BT;
  Stack S = CreatStack();  //创建并初始化堆栈S
  while (T || !IsEmpty(S))        //节点和栈都为空时才停止循环
  {
    while (T)                   //一直向左并将沿途节点压入堆栈
    {
      Push(S, T);
      printf("%5d", T->data); //访问栈顶元素
      T = T->Left;
    }
    if (!IsEmpty(S))            //当遇到左子树为空时,进行出栈
    {
      T = Pop(S);             //弹出栈顶元素
      T = T->Right;           //转向右子树
    }
  }
}

再看后序的非递归遍历,似乎上面的代码中只有第一次经过和第二次经过,没有第三次经过节点的了,所以不能在原来的基础上调整代码来实现后序非递归遍历了。

后序遍历

要实现后序非递归遍历,可以借助两个堆栈,一个用于存储遍历的序列,另一个用于存储中间节点。

具体实现的思路:

  1. 初始化两个堆栈s1和s2,将根节点压入s1中。
  2. 从s1中弹出栈顶节点,将其压入s2中。
  3. 如果该节点有左子节点,则将左子节点压入s1中。
  4. 如果该节点有右子节点,则将右子节点压入s1中。
  5. 重复步骤2到步骤4,直到s1为空。
  6. 从s2中依次弹出节点并输出,即可得到后序遍历序列。

思路图解


end



目录
相关文章
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
634 10
 算法系列之数据结构-二叉树
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
518 64
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
876 3
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
388 5
|
存储 缓存 算法
如何提高二叉树遍历算法的效率?
选择合适的遍历算法,如按层次遍历树时使用广度优先搜索(BFS),中序遍历二叉搜索树以获得有序序列。优化数据结构,如使用线索二叉树减少空指针判断,自定义节点类增加辅助信息。利用递归与非递归的特点,避免栈溢出问题。多线程并行遍历提高速度,注意线程安全。缓存中间结果,避免重复计算。预先计算并存储信息,提高遍历效率。综合运用这些方法,提高二叉树遍历算法的效率。
615 5
|
算法
树的遍历算法有哪些?
不同的遍历算法适用于不同的应用场景。深度优先搜索常用于搜索、路径查找等问题;广度优先搜索则在图的最短路径、层次相关的问题中较为常用;而二叉搜索树的遍历在数据排序、查找等方面有重要应用。
632 2
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
1298 0
|
数据采集 存储 算法
【C++数据结构——图】图的遍历(头歌教学实验平台习题) 【合集】
本文介绍了图的遍历算法,包括深度优先遍历(DFS)和广度优先遍历(BFS)。深度优先遍历通过递归方式从起始节点深入探索图,适用于寻找路径、拓扑排序等场景;广度优先遍历则按层次逐层访问节点,适合无权图最短路径和网络爬虫等应用。文中提供了C++代码示例,演示了如何实现这两种遍历方法,并附有测试用例及结果,帮助读者理解和实践图的遍历算法。
998 0
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
505 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
1012 0

热门文章

最新文章