数据结构:初识“树”

数据结构:初识“树”

一、“树”是什么

树(Tree) 是一种非线性、分层级的数据结构,它模拟了自然界中树的分支结构。核心特点是:一个节点可以有多个后继(子节点),但只能有一个前驱(父节点)。树结构是递归定义的。

在这里插入图片描述


如图,就是一棵树。

二、“树”的理解

我们可以把树想象成宗族关系

  • :A是整棵树的“根”,我们称A为根节点——相当于A是整个家族的老祖宗。
  • 对根节点以外的任意节点,都有父节点——除了老祖宗可能是石头缝里蹦出来的,其他人都得由父母生出来。
  • 节点不一定都有子节点
    • 没有子节点的,我们称为叶节点或终端节点
    • 有子节点的,我们称之为非叶子节点或分支节点
  • 兄弟节点:同一个父节点的孩子我们称之为兄弟节点
  • 在树形结构中,“大小”或“远近”这种关系仅在同一路径上具有明确的传递性——正如你必定比你的直系祖先(父亲、祖父)年轻,但你完全有可能比你叔叔(另一分支上的节点)年长!
在这里插入图片描述

三、树的基础概念

1. 度
  • 节点的度:该节点拥有的子节点数量
    • 例:某节点有2个子节点,则该节点的度为2
  • 树的度:树中所有节点的最大度值
    • 例:某树中所有节点的度最大为4,则该树的度为4
2. 层次与深度
  • 层次:根节点为第1层,其子节点为第2层,以此类推
  • 节点的深度:从根节点到该节点的路径长度(边数)
    • 根节点的深度为0或1(定义不同,常见为0)
3. 高度
  • 节点的高度:从该节点到最深叶子节点的最长路径长度
  • 树的高度:根节点的高度
    • 叶子节点的高度通常为0或1
4. 路径
  • 路径:从一个节点到另一个节点的节点序列
  • 路径长度:路径上的边数
5. 子树
  • 子树:树中任意节点及其所有后代构成的子结构

四、树节点的表示

理解树简单,但想实现树就有难度了

  • 比如:在定义树节点结构体的时候,我们应该如何定义呢。
    首先,我们还是要有数据域和指针域
    数据域很简单,就是存放当前节点的数据
  • 而让人困惑的点在于节点的指针域设计:我们确实需要存储子节点的引用,但由于每个节点可能拥有数量不确定的子节点,我们无法预先为一个节点分配固定大小的指针空间来存放所有子节点地址。这种不确定性使得简单的固定长度指针数组变得不可行。
  • 所以有人想出了一个非常巧妙的方法——左孩子右兄弟
    • 在左孩子-右兄弟表示法中,我们为树的每个节点设计两个指针域:
      • 左指针:指向该节点的第一个子节点(即“长子”)
      • 右指针:指向该节点在兄弟节点中的下一个兄弟
  • 通过这种方式:
    • 节点的所有子节点被组织成一个以第一个子节点为起点的单链表。
    • 每个子节点的右指针指向其下一个兄弟,从而将同一父节点的所有孩子串联起来。
    • 如果节点没有子节点,则左指针为空;如果没有兄弟节点,则右指针为空。

五、树与线性结构的核心区别

对比维度树结构线性结构
数据关系一对多层次关系一对一顺序关系
访问方式从根开始导航可直接索引访问
典型时间复杂度查找:O(log n)查找:O(n)
空间效率可能需要更多指针空间通常更紧凑
自然映射组织架构、文件系统任务列表、队列

六、二叉树

1、基本定义
  • 二叉树是每个节点最多有两个子节点的树形结构
  • 子节点严格区分为左子节点和右子节点,顺序不可互换
  • 二叉树可以是空树(无任何节点)
2、特点
  • 第 i 层最多有 2^(i-1) 个节点(i ≥ 1)
  • 深度为 k 的二叉树最多有 2^k - 1 个节点
  • 叶子节点数 n₀度为2的节点数 n₂ 的关系:n₀ = n₂ + 1
3、特殊二叉树类型
  • 满二叉树
    • 每一层节点数都达到最大值
    • 深度为 k 的满二叉树有 2^k - 1 个节点
  • 完全二叉树(堆)
    • 除最后一层外,其余层都是满的
    • 最后一层节点从左到右连续排列
    • 适合用数组高效存储
  • 二叉搜索树(BST)
    • 左子树所有节点值 < 根节点值 < 右子树所有节点值
    • 支持快速查找、插入、删除操作(平均 O(log n))
  • 平衡二叉树(如AVL树、红黑树)
    • 自动保持左右子树高度差在一定范围内
    • 避免退化成链表,保证操作效率
4、遍历方式
  • 深度优先遍历(递归/栈实现)
    • 前序遍历:根 → 左 → 右(适合复制树结构)
    • 中序遍历:左 → 根 → 右(BST得到有序序列)
    • 后序遍历:左 → 右 → 根(适合释放内存)
  • 广度优先遍历(队列实现)
    • 层次遍历:按层从左到右访问
      • 适合求树的高度、宽度等

七、结语

以上是本文的全部内容,后续会有树的代码实现等内容,如有错误,感谢指正,欢迎评论区讨论!

Read more

【程序员必备排障手册】:VSCode Copilot登录异常的10分钟自救法

第一章:VSCode Copilot登录异常的现状与影响 近期大量开发者反馈 VSCode 中 GitHub Copilot 扩展出现持续性登录失败问题,表现为状态栏图标显示“Sign in to GitHub”,点击后跳转至空白授权页、重定向循环或直接报错“Failed to fetch”。该异常并非偶发网络抖动所致,而是在 Windows/macOS/Linux 多平台、VSCode 1.85–1.90 版本中高频复现,且与用户是否启用代理、企业防火墙策略无强相关性。 典型错误现象 * 点击登录按钮后,浏览器打开 https://github.com/login/oauth/authorize?client_id=... 页面,但立即跳转至 vscode://github.copilot?code=

By Ne0inhk

解决VsCode远程服务器上Copilot无法使用Claude的问题

最近在用vscode中的GitHub copilot,发现无法使用claude系列的模型 很多小伙伴知道要开代理,开往带你以后claude确实会出来,本地使用没有任何问题,但是如果使用远程服务器ssh,claude系列的模型就消失了,参考这篇博客https://blog.ZEEKLOG.net/qq_40620465/article/details/152000104 按照博主的方法,需要加一个改动,在设置远程服务器(注意不是“用户”)的setting.json时需要加入"http.useLocalProxyConfiguration": true, 完成后再重启vscode,claude就有了:

By Ne0inhk

Photoshop AI插件革命:ComfyUI与Stable Diffusion无缝集成指南

还在为AI绘画工具与Photoshop之间的频繁切换而烦恼吗?今天,我们将为你揭秘Comfy-Photoshop-SD插件的完整使用方案,让设计师在熟悉的Photoshop环境中直接驾驭Stable Diffusion的强大AI绘画能力,实现真正的创意无界体验。 【免费下载链接】Comfy-Photoshop-SDDownload this extension via the ComfyUI manager to establish a connection between ComfyUI and the Auto-Photoshop-SD plugin in Photoshop. https://github.com/AbdullahAlfaraj/Auto-Photoshop-StableDiffusion-Plugin 项目地址: https://gitcode.com/gh_mirrors/co/Comfy-Photoshop-SD 🎯 快速入门:三步搭建AI创作环境 基础插件安装 首先需要安装Auto-Photoshop-SD插件的最新版本。选择.ccx或.zip

By Ne0inhk