二叉树遍历算法之一:前序遍历

article/2025/10/8 17:34:54

递归实现前序遍历

二叉树的前序遍历是指从根节点出发,按照先根节点,再左子树,后右子树的方法遍历二叉树中的所有节点,使得每个节点都被访问一次。

当调用遍历算法的时候前序遍历的具体过程如下:

  1. 首先访问根节点,如果根节点不为空,执行输出语句,打印根节点的值。
  2. 如果左子树不为空,则访问根节点的左孩子,并输出根节点做孩子的值
  3. 继续访问根节点的左孩子的左孩子,如果不为空则继续输出该左孩子的值;
  4. 如果这时左孩子为空,说明该节点是叶子节点,则按照先左孩子后右孩子的访问方式访问其左右孩子,如果不为空就打印输出
  5. 左子树访问完毕之后,继续访问根节点的右子树,如果根节点的右孩子不为空,则输出该右孩子
  6. 继续访问根节点右孩子的左孩子,如果不为空,则输出
  7. 接着访问根节点右孩子的右孩子,如果不为空,则输出

可以发现这个过程是不断循环进行的,可以使用递归算法实现,具体代码如下:

// 前序遍历的递归实现public void preOrderTraverse(TreeNode node) {if (node == null)return;// 先根节点System.out.println(node.val);// 再左孩子preOrderTraverse(node.left);// 后右孩子preOrderTraverse(node.right);}

为了测试使用,我构造一棵二叉树,先添加如下测试代码:

 
public static void main(String[] args) {TreeNode root = new TreeNode(8);TreeNode node1 = new TreeNode(6);TreeNode node2 = new TreeNode(10);TreeNode node3 = new TreeNode(5);TreeNode node4 = new TreeNode(7);TreeNode node5 = new TreeNode(9);TreeNode node6 = new TreeNode(11);TreeNode node7 = new TreeNode(15);TreeNode node8 = new TreeNode(24);TreeNode node9 = new TreeNode(30);TreeNode node10 = new TreeNode(28);root.left = node1;root.right = node2;node1.left = node3;node3.left = node7;node7.right = node8;node1.right = node4;node2.left = node5;node2.right = node6;node5.left = node9;node6.right = node10;TraverseTree t = new TraverseTree();t.preOrderTraverse(root);}

构造出来的二叉树是这样的:

二叉树

所以根据前面的前序遍历算法遍历的结果应该是:8,6,5,15,24,7,10,9,30,11,28

非递归方式实现前序遍历

 

                                                                               

                                                                           (图1) 前序遍历                   

 

                                                                     

                                                             (图2) 前序遍历访问3号结点时的栈状态

    【思路】

   1.对于前序遍历,每当访问一个结点时,先打印结点。
    2.如果存在右子树,那么将右子树的根节点进行进栈保存,否则忽略。
    3.如果存在左子树,那么将左子树的根节点进行进栈保存,然后弹出,将遍历引用指向左子树根节点,否则出栈回溯。
    4.循环的退出条件是需要出栈操作时,栈为空,无法进行该操作。

代码一

import java.util.ArrayList;
import java.util.EmptyStackException;
import java.util.List;
import java.util.Stack;public class PreOrderTraversal {public static List<Integer> preOrderTraversal(TreeNode root) {Stack<TreeNode> stack = new Stack<TreeNode>();List<Integer> result = new ArrayList<Integer>();if (root == null) {return result;} else {TreeNode node = root;while (true) {result.add(node.val);if (node.right != null) {//左节点入栈stack.push(node.right);}if (node.left != null) {//右节点入栈,并弹出stack.push(node.left);node = stack.pop();} else {try {//左子节点没有,并且栈不空,就开始弹出保存的右子节点node = stack.pop();} catch (EmptyStackException e) {node = null;}}//栈空,并且没有左子树,结束循环if (node == null) {break;}}}return result;}
}

 

代码二】递归代码很简洁,但是也有一些不是很好理解,能不能直接使用循环的方法加以解决呢?采用非递归的思路其实与上面是一致的,不过在遍历的过程中需要使用一些额外的空间保存遍历的中间结果,下面是使用非递归的方式实现前序遍历的代码:

// 前序遍历的非递归实现public void preOrderTraverse2(TreeNode node) {if (node == null) return;//创建一个栈用于保存遍历的结点Stack<TreeNode> s = new Stack<TreeNode>();while(node != null || !s.isEmpty()){//遍历左子树while(node != null){System.out.print(node.val + " ");s.push(node);node = node.left;}//遍历右子树if(!s.isEmpty()){node = s.pop();node = node.right;}}}

 

 

 

 

 


http://chatgpt.dhexx.cn/article/pgqF9F78.shtml

相关文章

二叉树遍历小结

前言 二叉树是相当重要的数据结构&#xff0c;目前我还只会玩玩它的遍历&#xff08;年轻不懂事没好好学&#xff0c;不然早就达到人生巅峰了&#xff09;&#xff0c;LeetCode上二叉树的简单题&#xff0c;大部分通过遍历加一点小逻辑即可解决&#xff0c;所以总结一下几种遍…

二叉树遍历之层次遍历算法入门详解

一、引言 二叉树的遍历常见的方法有先序遍历、中序遍历、后序遍历和层次遍历等&#xff0c;本文给出了C语言版本的层次遍历二叉树的算法。 层次遍历的原理很简单&#xff0c;总结为一句话就是“从上到下&#xff0c;从左到右”&#xff0c;就是从树根开始逐层访问二叉树的结点&…

二叉树的四种遍历算法

二叉树作为一种重要的数据结构&#xff0c;它的很多算法的思想在很多地方都用到了&#xff0c;比如STL算法模板&#xff0c;里面的优先队列、集合等等都用到了二叉树里面的思想&#xff0c;先从二叉树的遍历开始&#xff1a; 看二叉树长什么样子&#xff1a; 我们可以看到这颗…

实现二叉树各种遍历算法

目录 前言一、题目1.二叉树的各种遍历过程及遍历算法设计。2.实现二叉树各种遍历算法 总结 前言 提示&#xff1a;记得关注我哦&#xff01;&#xff01;&#xff01; 一、题目 1.二叉树的各种遍历过程及遍历算法设计。 &#xff08;1&#xff09; 先序遍历二叉树&#xff1…

算法分析之二叉树遍历

算法相关数据结构总结&#xff1a; 序号数据结构文章1动态规划动态规划之背包问题——01背包 动态规划之背包问题——完全背包 动态规划之打家劫舍系列问题 动态规划之股票买卖系列问题 动态规划之子序列问题 算法&#xff08;Java&#xff09;——动态规划2数组算法分析之数…

二叉树遍历算法总结

A. 二叉树的遍历 1.前序遍历二叉树&#xff1a; (1)若二叉树为空&#xff0c;则为空操作&#xff0c;返回空。 (2)访问根结点。 (3)前序遍历左子树。 (4)前序遍历右子树。 a.二叉树前序遍历的递归算法&#xff1a; void PreOrderTraverse(BiTree BT)…

二叉树的遍历算法

遍历是对树的一种最基本的运算&#xff0c;所谓遍历二叉树&#xff0c;就是按一定的规则和顺序走遍二叉树的所有节点&#xff0c;使每一个节点都被访问一次&#xff0c;而且只被访问一次。由于二叉树是非线性结构&#xff0c;因此&#xff0c;树的遍历实质上是将二叉树的各个节…

【算法】二叉树遍历算法总结:前序中序后序遍历

前言 二叉树遍历是非常经典的算法题&#xff0c;也是二叉树的一道基础算法题。 但是在平常的笔试面试中&#xff0c;其出现的频率其实并不是特别的高&#xff0c;我推测是这种题目相对来说比较基础&#xff0c;算是一个基础知识点。 比如剑指offer中出现的后序遍历题目&…

二叉树遍历算法的应用

目录 一、二叉树遍历算法的应用——二叉树的创建 二、二叉树遍历算法的应用——复制二叉树 三、二叉树遍历算法的应用——计算二叉树的深度 四、二叉树遍历算法的应用——计算二叉树节点总数 五、二叉树遍历算法的应用——计算二叉树叶子节点数 一、二叉树遍历算法的应用—…

一文弄懂二叉树的三种遍历方式

关注公众号【高性能架构探索】&#xff0c;后台回复【pdf】&#xff0c;免费获取计算机必备经典书籍 俗话说&#xff1a;学如逆水行舟,不进则退;心似平原走马,易放难收。这句话对程序员而言&#xff0c;体会更深。这行已经越来越卷了&#xff0c;时刻准备着&#xff0c;&#x…

二叉树遍历算法

目录 先序遍历 中序遍历 后序遍历 层序遍历 938. 二叉搜索树的范围和 110. 平衡二叉树 114. 二叉树展开为链表 117. 填充每个节点的下一个右侧节点指针 II 116. 填充每个节点的下一个右侧节点指针 1&#xff0c;三种遍历都是先把二叉树的最左结点循环入栈(DFS迭代)&am…

二叉树的四种遍历算法(结构体数组)

一、二叉树的定义 以字符串的形式定义一棵二叉树的先序序列&#xff0c;若字符是‘#’&#xff0c;表示该二叉树是空树&#xff0c;否则该字符是相应结点的数据元素。 例&#xff1a;ABDG##HI####CE#J##F## 对应的二叉树&#xff1a; 思路讲解&#xff1a; 想要遍历二叉树&am…

二叉树的四种遍历方式

概要 树本身是一种简单化的图 &#xff1b; DFS对应前中后序遍历&#xff0c;BFS对应层序遍历 二叉树结构 struct treenode {int val;treenode *left;treenode *right;treenode() : val(0), left(nullptr), right(nullptr) {}treenode(int x) : val(x), left(nullptr), right(n…

针对Linux学习,值得阅读的五本书籍,不看可能错失机会

今天为了总结一些可以帮助各位在学习过程中提供帮助的一些书籍。 一.鸟叔的私房菜&#xff1a; 本书是知名度颇高的Linux入门书《鸟哥的Linux私房菜基础学习篇》的新版,而详细地介绍了Linux操作系统。全书分为五部分;第一部分部分着重说明计算机的基础知识、Linux的学习方法&a…

从零开始学习Linux(一)关闭虚拟机系统

关闭系统&#xff0c;需要输入如下命令 poweroff然而&#xff0c;你只能得到如下反馈 -bash: poweroff:command not found此项错误是因为poweroff命令是一个系统管理命令。执行此项命令需要高级使用者特权。 因此&#xff0c;为了关闭系统&#xff0c;我们首先需要切换到root…

个人随笔/小白应该如何学习Linux,我的一些心得分享.

大家好&#xff0c;今天给大家分享一下0基础的人如何入门Linux&#xff0c;此文来源&#xff1a;我在上班的路上看到一篇文章&#xff0c;也是写的0基础的人如何学习Linux的文章。当时我在想&#xff0c;我写博文一年多&#xff0c;都是相关Linux及Python等技术的文章&#xff…

Linux学习路线

&#xfeff;&#xfeff; 关于 Linux Linux 因其开源&#xff0c;免费&#xff0c;可裁剪&#xff0c;被应用到很多领域&#xff0c;尤其是嵌入式设备上。 Android 系统内核也是基于 Linux 的。 另外还有各种服务器和工作站也是用的 Linux。 什么是嵌入式设备&#xff1f;…

为什么要学习 Linux ????

目前企业中大量的使用Linux作为服务器&#xff0c;在以后你们就业后&#xff0c;会发现web服务器Tomcat ,jobss这一类都是搭建在linux上面的&#xff0c;后面我们需要学习的数据库mysql &#xff0c; oracle &#xff0c;db2&#xff0c; 或者greenplum这一类的&#xff0c;在企…

Linux 学习路线图

1.应用场景 更加高效地学习并达到运用Linux. 2.学习/操作 linux运维学习需要分为四个阶段&#xff1a;初级入门、中级进阶、高级提升、资深方向细化。 第一阶段&#xff1a;初级入门 初级阶段需要把linux学习路线搞清楚&#xff0c;任何学习都是循序渐进的&#xff0c;所以学…

从零入门机器学习之Linux系统详解

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,科大讯飞比赛第三名,CCF比赛第四名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…