树和图均依赖引用实现节点连接:树通过父子引用构建单向层次结构,支持遍历与动态修改;图通过邻接引用集合表达多对多关系,支撑dfs/bfs等算法,二者均需防范空引用与循环引用风险。

引用类型在树和图这类非线性数据结构中,是实现节点连接与动态关系的核心机制。
树节点间依赖引用构建层次结构
树的每个节点通常包含数据域和一个或多个指向子节点的引用(如 left、right 在二叉树中;或 children 列表在多叉树中)。这些引用不是复制对象,而是指向内存中实际节点的位置,从而避免数据冗余,并支持父子关系的动态维护。
- 根节点通过引用关联其子节点,子节点再通过各自引用向下延伸,形成递归嵌套结构
- 插入或删除节点时,只需调整相关引用(如 parent.child = newChild),无需移动整块数据
- 遍历操作(前序、中序、后序)本质上是沿着引用链逐跳访问,依赖引用的可达性保证路径唯一
图结构靠引用(或引用容器)表达复杂连接
图的顶点和边建模高度依赖引用:顶点对象常持有邻接顶点的引用集合(如 List
- 无向图中,A 的 neighbors 包含 B,B 的 neighbors 也包含 A——双方互相引用,体现对称关系
- 有向图中,引用单向存在(如 A → B),自然表达依赖、流向或调用关系
- 图算法(如 DFS/BFS)依靠引用快速抵达相邻节点,避免重复查找或索引映射开销
引用使树与图支持共享子结构与动态修改
由于节点通过引用被多个地方持有,同一节点可同时出现在不同路径中(如森林中的共用子树),或被多个父节点“软链接”(需注意循环引用风险)。
- DOM 树、AST 抽象语法树等实际系统中,节点引用允许跨组件复用与局部更新
- 图的子图提取、树的剪枝/嫁接,本质都是引用的增删与重定向
- 垃圾回收机制依赖引用计数或可达性分析,自动管理不再被任何引用指向的节点内存
注意事项:空引用与循环引用需主动防范
引用类型的灵活性伴随潜在风险。树中未初始化的 child 引用为 null,图中不当设计易导致 A→B→A 的循环引用,影响遍历终止与内存释放。
- 构造节点时显式初始化引用字段(如 children = new ArrayList()),减少 NullPointerException
- 图遍历时使用 visited 集合标记已访问节点,防止无限递归
- 设计 API 时明确所有权语义(谁负责创建/销毁节点),避免悬空引用或重复释放











