You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

非二叉树最左与最右节点的定义及多子节点树的查找方法问询

多叉树的最左/最右节点定义与查找方法

好问题!其实对于节点可拥有任意数量子节点的多叉树,最左/最右节点的定义是从二叉树的概念延伸而来的,但核心前提是你需要先约定子节点的排列顺序——因为多叉树本身没有天然的“左”“右”之分,得靠人为定义的子节点顺序来锚定。

一、定义规则

我们可以类比二叉树的逻辑,给多叉树的最左/最右节点做如下定义:

  • 最左节点:从根节点开始,每次都选择当前节点的第一个子节点(比如你在代码里存储子节点的列表中,索引最靠前的那个),一直遍历到没有子节点的叶子节点为止,这个节点就是整棵树的最左节点。
  • 最右节点:同理,从根节点开始,每次选择当前节点的最后一个子节点(列表索引最靠后的那个),遍历到叶子节点,就是整棵树的最右节点。

注意:如果你的多叉树没有明确子节点的顺序(比如子节点是无序集合),那“最左/最右”这个概念其实没有意义,因为子节点的排列是随机的。所以第一步要确保你的树结构里,子节点是按固定顺序存储的(比如从左到右的视觉顺序对应列表的先后顺序)。

二、查找实现

这里用Python示例来展示递归和迭代两种查找方式,假设树节点的结构是:

class TreeNode:
    def __init__(self, val):
        self.val = val
        self.children = []  # 子节点列表,按从左到右顺序存储

1. 递归实现

  • 查找最左节点:
def find_leftmost(node):
    # 没有子节点,就是当前节点
    if not node.children:
        return node
    # 递归遍历第一个子节点
    return find_leftmost(node.children[0])
  • 查找最右节点:
def find_rightmost(node):
    if not node.children:
        return node
    # 递归遍历最后一个子节点
    return find_rightmost(node.children[-1])

2. 迭代实现(避免递归深度问题)

  • 查找最左节点:
def find_leftmost_iterative(node):
    current = node
    # 只要有子节点,就一直取第一个
    while current.children:
        current = current.children[0]
    return current
  • 查找最右节点:
def find_rightmost_iterative(node):
    current = node
    while current.children:
        current = current.children[-1]
    return current

三、和二叉搜索树的区别

在二叉搜索树里,最左/最右节点对应最小/最大值,这是因为二叉搜索树有值的约束规则:左子节点的值小于父节点,右子节点的值大于父节点——这时候“左”“右”不仅是位置顺序,还和值的大小绑定了。

但对于普通多叉树:

  • 如果你的多叉树也有类似的排序规则(比如每个节点的子节点按值从小到大排列,第一个子节点是最小的,最后一个是最大的),那这时候最左节点就是整棵树的最小值,最右是最大值;
  • 如果没有值的约束,那最左/最右节点只是基于子节点存储顺序的遍历结果,和节点值的大小无关。

内容的提问来源于stack exchange,提问作者PumpkinBreath

火山引擎 最新活动