You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Python生成器的二叉搜索树(BST)高度方法实现求助

二叉搜索树高度实现:无需依赖中序遍历生成器

首先明确:计算BST高度的核心是基于节点的层级关系(当前节点到最远叶子节点的路径长度),和中序遍历的生成器逻辑完全无关——生成器只是用来输出有序节点序列的,它不会保留节点的层级信息,所以用生成器来实现height方法反而会绕远路。

最优实现:递归计算高度

这是最直接高效的方式,逻辑是:

  • 空节点的高度定义为-1(这样叶子节点的高度为0,符合“路径长度”的定义)
  • 非空节点的高度 = 1 + max(左子树高度, 右子树高度)

假设你的节点类和BST类基础结构如下:

class Node:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None

    def inorder(self):
        # 你的中序遍历生成器
        if self.left:
            yield from self.left.inorder()
        yield self
        if self.right:
            yield from self.right.inorder()

class BST:
    def __init__(self):
        self.root = None

给Node和BST添加height方法:

class Node:
    # 保留原有__init__和inorder方法
    def height(self):
        left_h = self.left.height() if self.left else -1
        right_h = self.right.height() if self.right else -1
        return 1 + max(left_h, right_h)

class BST:
    # 保留原有__init__方法
    def height(self):
        return self.root.height() if self.root else -1

为什么不用生成器?

你的中序遍历生成器只会返回节点对象,没有任何关于节点所在层级、父节点的信息。如果硬要基于生成器实现height,你需要额外遍历所有节点并计算每个节点的深度(根到该节点的路径长度),然后取最大深度作为树的高度——这完全是多此一举,因为你需要额外的遍历逻辑来追踪深度,反而不如直接递归计算高效。

如果非要演示这种绕路的方式(仅作理解用,不推荐):

class BST:
    # 保留原有方法
    def height_using_generator(self):
        if not self.root:
            return -1
        
        # 用栈迭代遍历,同时记录节点深度,复用中序遍历逻辑
        stack = [(self.root, 0, False)]
        max_depth = 0
        
        while stack:
            node, depth, visited = stack.pop()
            if visited:
                if depth > max_depth:
                    max_depth = depth
                continue
            
            # 中序遍历栈顺序:右-根-左(栈是后进先出)
            if node.right:
                stack.append((node.right, depth + 1, False))
            stack.append((node, depth, True))
            if node.left:
                stack.append((node.left, depth + 1, False))
        
        return max_depth

这个方法本质是把中序遍历的生成器逻辑改成迭代遍历,同时追踪深度,最终用最大深度作为树的高度(和递归实现的高度定义一致)。


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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:01:20