当前位置: 首页 > news >正文

二叉树结构的深入学习

目录

1. 节点结构

1.1.值(val)

1.2.左右孩子节点

2.本质

3.类型

4.遍历方式


        树是一种递归的数据结构。具有一个根节点和多个子节点,形成邻接关系,每个节点可以有零个或多个子节点。

        树的定义是递归的,由根节点的其他若干个互不相交的子树组成。每个子树,又是如此的定义,所以是递归的。因此,关于树的算法也常用递归算法。


1. 节点结构

对于二叉树来说。

1.1.值(val)

        每个节点都有一个值(在这里是 int val),它可以存储节点所代表的数据。

        比如在一个二叉搜索树(Binary Search Tree)中,这个值可以用来进行查找、插入和删除操作。

1.2.左右孩子节点

        每个节点都有两个指针(或引用),分别指向左子节点和右子节点(TreeNode left; TreeNode right;)。这就是树的结构:一个节点可以有零个(在叶子节点的情况下)、一个或两个子节点。


2.本质

        树是一种递归的数据结构。即一个树的每个节点都可以看作是一个树的根节点,它的子节点又是另一个树的根。所以,TreeNode 类可以嵌套使用,以形成一棵完整的树。


3.类型

TreeNode 类可以用来表示不同类型的树:

  • 二叉树: 每个节点最多有两个子节点(左、右)。
  • 二叉搜索树: 按照特定的规则组织节点,左子节点值小于根节点,右子节点值大于根节点。
  • N-叉树: 只需扩展 TreeNode 类,允许一个节点有多个子节点(如使用一个列表来存储多个子节点)。
  • 满二叉树


4.遍历方式

1.前序遍历(Pre-order Traversal):

在前序遍历中,根节点是在访问过程中最先被访问的。访问顺序为:

  • 先访问根节点
  • 然后递归遍历左子树
  • 最后递归遍历右子树

顺序: 根 → 左 → 右

2.中序遍历(In-order Traversal): 遍历左子树,访问根节点,然后遍历右子树。

在中序遍历中,根节点是在访问过程中被后期访问的。访问顺序为:

  • 先递归遍历左子树
  • 然后访问根节点
  • 最后递归遍历右子树

顺序: 左 → 根 → 右

3.后序遍历(Post-order Traversal): 遍历左子树,遍历右子树,然后访问根节点。

在后序遍历中,根节点是在访问过程中最后被访问的。访问顺序为:

  • 先递归遍历左子树
  • 然后递归遍历右子树
  • 最后访问根节点

顺序: 左 → 右 → 根

4.层序遍历(Level-order Traversal): 按照树的层次结构从上到下逐层遍历节点。

import java.util.LinkedList;
import java.util.Queue;class TreeNode {private int val;         // 节点的值TreeNode left;          // 左子节点TreeNode right;         // 右子节点public TreeNode(int val) {this.val = val;this.left = null;   // 初始化左子节点this.right = null;  // 初始化右子节点}public int getVal() {return val;}
}public class BinaryTree {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);// 创建左子节点的右子节点// 遍历整棵树System.out.println("前序遍历:");preOrderTraversal(root); // 先序遍历System.out.println("\n中序遍历:");inOrderTraversal(root); // 中序遍历System.out.println("\n后序遍历:");postOrderTraversal(root); // 后序遍历System.out.println("\n层序遍历:");levelOrderTraversal(root); // 层次遍历}// 前序遍历public static void preOrderTraversal(TreeNode node) {if (node != null) {System.out.print(node.getVal() + " ");preOrderTraversal(node.left);preOrderTraversal(node.right);}}// 中序遍历public static void inOrderTraversal(TreeNode node) {if (node != null) {inOrderTraversal(node.left);System.out.print(node.getVal() + " ");inOrderTraversal(node.right);}}// 后序遍历public static void postOrderTraversal(TreeNode node) {if (node != null) {postOrderTraversal(node.left);postOrderTraversal(node.right);System.out.print(node.getVal() + " ");}}// 层序遍历public static void levelOrderTraversal(TreeNode root) {if (root == null) return;Queue<TreeNode> queue = new LinkedList<>();queue.add(root);while (!queue.isEmpty()) {TreeNode node = queue.poll();System.out.print(node.getVal() + " ");if (node.left != null) queue.add(node.left);if (node.right != null) queue.add(node.right);}}
}

树的示意图

上面的例子中构建的二叉树结构如下所示:

       1/ \2   3/ \ / \4  5 6  7
遍历结果
前序遍历: 1 2 4 5 3 6 7
中序遍历: 4 2 5 1 6 3 7
后序遍历: 4 5 2 6 7 3 1
层序遍历: 1 2 3 4 5 6 7

总结

        树被称为“平衡”的通常是指在进行插入和删除操作后,树的高度保持在一个小的范围内,以确保在最坏情况下仍然能够保持高效的搜索、插入和删除操作。

        一些常见的自平衡树包括红黑树、AVL树等。

通常情况下:

        如果树结构变得不平衡,树会通过重新调整(旋转)来恢复平衡,而不是回滚到链表结构。


参考:

1、树的4种遍历_树的前序遍历-CSDN博客

相关文章:

  • PostgreSQL安装与升级cron插件
  • 基于STM32、HAL库的FT234XD USB转UART收发器 驱动程序设计
  • 企业数字化转型的建设流程和实施条件分别是什么?
  • 【Windows 环境安装ollama,通过ollama拉起大模型】
  • 单片机 + 图像处理芯片 + TFT彩屏 指示灯控件
  • 《P2880 [USACO07JAN] 平衡系列 G》
  • 19.idea调试功能
  • 【嵌入式开发-RS-485】
  • 阀门产业发展方向报告(石油化工阀门应用技术交流大会)
  • 蓝绿发布与金丝雀发布
  • 兼具直连存储与分布式存储优势的混合存储方案
  • AI搜索的未来:技术纵深发展与关键突破路径
  • 自动机小述(三又二分之一)
  • 数组和指针典型例题合集(一维数组、字符数组、二维数组)
  • 量化策略兼容性设计
  • Linux常用命令34——uname显示系统内核信息
  • AtCoder Beginner Contest 404 A-E 题解
  • QT中多线程的实现
  • 位运算题目:安排电影院座位
  • 编专利或委托他人编专利属于学术不端行为吗?
  • 2025中国南昌国际龙舟赛5月23日启幕,是历年来南昌举办的最高规格龙舟赛事
  • 越怕出错越会出错,“墨菲定律”的魔咒该怎么破?
  • 国家发改委:美芯片药品等领域关税影响全球科技发展,损害人类共同利益
  • 来论|建设性推进缅北和平进程——中国的智慧与担当
  • 特朗普称美军舰商船应免费通行苏伊士运河,外交部:反对任何霸凌言行
  • 长三角多地重启游轮跨市游,“恢复苏杭夜航船”呼声又起