蓝桥杯 Java B 组 之树的基础(二叉树遍历)

news/2025/2/21 13:19:44/

Day 4:树的基础(二叉树遍历)


 一、什么是树?

树(Tree)是一种 层次结构 的数据结构,它由节点(Node)组成,每个节点可以有 多个子节点。树的应用非常广泛,如:

  • 文件系统
  • 数据库索引
  • 二叉搜索树(BST)
  • 网络路由树


 二、二叉树(Binary Tree)基础

 1. 什么是二叉树?

二叉树是一种特殊的树形结构,每个节点最多有两个子节点:

  • 左子节点(Left Child)
  • 右子节点(Right Child)

 2. 二叉树的基本概念

  • 根节点(Root):二叉树的顶层节点
  • 叶子节点(Leaf):没有子节点的节点
  • 父节点(Parent):拥有子节点的节点
  • 子节点(Children):属于某个父节点的节点
  • 高度(Height):从叶子节点到根节点的最长路径长度
  • 深度(Depth):某个节点到根节点的路径长度

示例二叉树:

       1

      / \

     2   3

    / \   \

   4   5   6


 三、二叉树的遍历

二叉树遍历有 两大类

  1. 深度优先遍历(DFS) 
    • 前序遍历(Preorder):根 → 左 → 右
    • 中序遍历(Inorder):左 → 根 → 右
    • 后序遍历(Postorder):左 → 右 → 根
  2. 广度优先遍历(BFS) 
    • 层序遍历(Level Order)

 1. 二叉树节点定义

在 Java 中,二叉树的基本节点(TreeNode)可以这样定义:

class TreeNode {

    int value;  // 节点值

    TreeNode left;  // 左子节点

    TreeNode right; // 右子节点

    public TreeNode(int value) {

        this.value = value;

        this.left = null;

        this.right = null;

    }

}


 四、递归遍历二叉树

递归(Recursion)是二叉树遍历的常见方式,它利用函数调用栈来实现深度优先搜索。


1️⃣ 前序遍历(Preorder Traversal)

 访问顺序: 根 → 左 → 右

public class BinaryTreeTraversal {

    // 前序遍历

    public static void preorder(TreeNode root) {

        if (root == null) return;  // 递归终止条件

        System.out.print(root.value + " ");  // 访问根节点

        preorder(root.left);  // 递归访问左子树

        preorder(root.right); // 递归访问右子树

    }

    public static void main(String[] args) {

        // 创建二叉树

        TreeNode root = new TreeNode(1);

        root.left = new TreeNode(2);

        root.right = new TreeNode(3);

        root.left.left = new TreeNode(4);

        root.left.right = new TreeNode(5);

        root.right.right = new TreeNode(6);

        System.out.print("前序遍历:");

        preorder(root);

    }

}

✅ 运行结果:

前序遍历:1 2 4 5 3 6


2️⃣ 中序遍历(Inorder Traversal)

访问顺序: 左 → 根 → 右

public class BinaryTreeTraversal {

    // 中序遍历

    public static void inorder(TreeNode root) {

        if (root == null) return;  // 递归终止条件

        inorder(root.left);  // 递归访问左子树

        System.out.print(root.value + " ");  // 访问根节点

        inorder(root.right); // 递归访问右子树

    }

    public static void main(String[] args) {

        TreeNode root = new TreeNode(1);

        root.left = new TreeNode(2);

        root.right = new TreeNode(3);

        root.left.left = new TreeNode(4);

        root.left.right = new TreeNode(5);

        root.right.right = new TreeNode(6);

        System.out.print("中序遍历:");

        inorder(root);

    }

}

✅ 运行结果:

中序遍历:4 2 5 1 3 6


3️⃣ 后序遍历(Postorder Traversal)

 访问顺序: 左 → 右 → 根

public class BinaryTreeTraversal {

    // 后序遍历

    public static void postorder(TreeNode root) {

        if (root == null) return;  // 递归终止条件

        postorder(root.left);  // 递归访问左子树

        postorder(root.right); // 递归访问右子树

        System.out.print(root.value + " ");  // 访问根节点

    }

    public static void main(String[] args) {

        TreeNode root = new TreeNode(1);

        root.left = new TreeNode(2);

        root.right = new TreeNode(3);

        root.left.left = new TreeNode(4);

        root.left.right = new TreeNode(5);

        root.right.right = new TreeNode(6);

        System.out.print("后序遍历:");

        postorder(root);

    }

}

✅ 运行结果:

后序遍历:4 5 2 6 3 1


 五、二叉树遍历总结

遍历方式

访问顺序

适用场景

前序遍历

根 → 左 → 右

适合 复制树、表达式计算

中序遍历

左 → 根 → 右

适合 二叉搜索树(BST)遍历

后序遍历

左 → 右 → 根

适合 删除节点、释放内存


六、二叉树常考点与易错点

�� 1. 常考点

递归 vs 迭代遍历
二叉树的构造与遍历
二叉搜索树的中序遍历(结果是有序的)


�� 2. 易错点

递归终止条件错误

if (root == null) return;

错误的访问顺序

System.out.print(root.value + " "); // 误将根节点提前打印

inorder(root.left);

inorder(root.right);

正确的中序遍历

inorder(root.left);

System.out.print(root.value + " ");

inorder(root.right);


�� 七、学习建议

  1. 递归终止条件:在递归实现遍历的过程中,要注意递归的终止条件,即当节点为空时要及时返回,否则会导致栈溢出错误。
  2. 遍历顺序混淆:前序、中序、后序遍历的顺序容易混淆,在写代码时要仔细区分不同遍历方式的访问顺序。
  3. 边界情况处理:对于空树的情况,要确保代码能够正确处理,避免出现空指针异常。


二叉树的遍历:前序、中序、后序遍历的递归实现。

树的构造:根据遍历结果重建二叉树。

树的深度和高度:计算二叉树的深度或高度。

树的遍历应用:如查找特定节点、统计节点数量等。


http://www.ppmy.cn/news/1573894.html

相关文章

机器学习数学基础:29.t检验

一、t 检验的定义与核心思想 (一)定义 t 检验(Student’s t - test)是一种在统计学领域中广泛应用的基于 t 分布的统计推断方法。其主要用途在于判断样本均值与总体均值之间,或者两个独立样本的均值之间、配对样本的…

Simple_SSTI_2(WEB)

这道题我也是第一次碰,不过我很好奇为什么我不从SSTI_1开始做 ##解题思路 拿到页面一串英文,告诉我们缺少一个flag参数,于是我令flag1,于是打印了1,输入各种语句也是,原封不动变为传入的字符串 根据题目提…

校招后台开发:JAVA和GO选哪一个?

有同学过来咨询说:“大拿老师我之前有过go语言的实习,但是我在校招里面发现go语言的校招岗位不是很多,我是投java的岗位还是投go的岗位? 这个问题呢这两年来也有很多同学问过,下面我们来详细说说应该怎么选&#xff1…

C++ 设计模式-责任链模式

模拟网络请求处理管道&#xff0c;包含动态处理器注册、请求修改和条件传递等特性&#xff1a; #include <iostream> #include <memory> #include <vector> #include <string>// 请求上下文&#xff0c;包含可修改的状态 struct RequestContext {std:…

排序算法复习——包括插入排序、希尔排序、冒泡排序、快排(包括霍尔法、挖坑法、快慢指针法)、堆排、选择排序、归并排序等 (代码采用c/c++混编)

1.插入排序 插入排序就像我们打斗地主的时候&#xff0c;有一大把牌我们来不及理&#xff0c;就会一张一张的拿然后把拿到的牌放到合适的位置。 对于插入排序我们可以将待排序的数组理解为那一堆没有整理的牌&#xff0c;将排序好的部分理解为手上的牌&#xff0c;对于第i张牌我…

Pycharm安装教程超详细图文教程,超详细Pycharm安装保姆级教程

文章目录 前言一、环境搭建1. 下载 PyCharm2. 下载 Python3. 安装 Python4. pycharm安装教程 总结 前言 在 Python 编程的广阔天地里&#xff0c;拥有一款强大且称手的集成开发环境&#xff08;IDE&#xff09;至关重要。PyCharm 作为 JetBrains 公司推出的一款专业 Python ID…

Docker Desktop 入门教学

引言 Docker Desktop 是 Docker 官方为开发者提供的桌面应用程序&#xff0c;支持在 Windows 和 macOS 上轻松构建、运行和共享容器化应用程序。它集成了 Docker 引擎、Docker CLI 客户端以及 Docker Compose 等工具&#xff0c;方便您在本地开发和测试。 一、快速安装 1. 系…

网络协议相关知识有哪些?

前言 网络协议的基础是OSI和TCP/IP模型,这两个模型是理解协议分层的关键。 正文(仅是个人理解,如有遗漏望海涵) 网络协议是网络中设备间通信的规则和标准,涉及数据传输、路由、错误控制等多个方面。以下是网络协议相关知识的系统梳理: 一、网络协议分层模型 1、OSI七…