树中某结点的上层结点称为其双亲(或父结点),下层结点称为其孩子(或子结点);每个非根结点有且仅有一个双亲,每个非叶结点可有多个孩子,父子关系具有唯一性、方向性和存在性。

树结构里,父子关系不是靠记忆背出来的,而是靠规则“长”出来的。一个节点的父节点,就是它直接上级,且每个非根节点有且只有一个——这是理解所有树操作的起点。
父节点的三个硬性特征
父节点不是随便指认的,它必须满足三条基本规则:
- 唯一性:除根节点外,每个节点只能有一个父节点。出现两个“父亲”,就不是树,而是图了
- 方向性:父子关系是单向的(父 → 子),不能反向推导。子节点知道父是谁,但父节点不天然知道哪个子是“最新来的”
- 存在性:根节点没有父节点,它的父引用必须为 null 或 None;其他所有节点,父引用不能为空
怎么确定某个节点的父节点?
关键看它是怎么被插入或创建的:
- 在数组表示的完全二叉树中,索引为 i 的节点,父节点索引恒为 (i − 1) // 2(整除)
- 在动态构建的BST中,新节点从根出发比较大小,一路向下,最后停在某个空子位置——那个“接待它”的节点,就是它的父节点
- 在UI树(如PyQt、DOM)中,父节点通常由构造时传入的 parent 参数或布局容器决定,属于显式声明关系
父子关系不是静态标签,而是操作结果
很多初学者误以为父子关系是“写死”的,其实它会随操作变化:
- 删除一个节点时,它的子节点不会自动消失,但它们的父引用必须更新(比如指向原祖父,或设为新父)
- 移动节点(如拖拽树节点)本质是解除旧父子连接、建立新父子连接,两端都要重置 parent 和 children 字段
- 序列化/反序列化树时,若只保存子节点列表而忽略父引用,重建时需重新遍历计算父关系,否则层级会错乱
常见误区提醒
这些说法看似合理,实则违背树的基本定义:
- “这个节点有两个父节点” → 违反唯一性,已不是树结构
- “叶子节点没有父节点” → 错误。叶子只是没有子节点,它照样有父节点(除非它就是根)
- “父节点一定比子节点大(或小)” → 仅适用于BST等有序树,普通树无此要求

















