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

二叉树迭代式中序遍历返回含None结果的问题求助

二叉树迭代式中序遍历返回多余None的问题

我实现了一个用于创建二叉树的BinaryTree类,代码如下:

class BinaryTree:

    def __init__(self):
        self._root = None
        self._left = None
        self._right = None

    def root(self):
        return self._root

    def left(self):
        return self._left

    def right(self):
        return self._right

    def isEmpty(self):
        return self._root is None

    def insert(self, element):
        if self.isEmpty():
            self._root = element
            self._left = BinaryTree()
            self._right = BinaryTree()
        elif element <= self._root:
            self._left.insert(element)
        elif element > self._root:
            self._right.insert(element)

    def inOrder(self):
        if self.isEmpty():
            return []
        l = self._left.inOrder()
        l.append(self._root)
        l += self._right.inOrder()
        return l

    def preOrder(self):
        if self.isEmpty():
            return []
        l = [self._root]
        l += self._left.preOrder()
        l += self._right.preOrder()
        return l

    def inOrder_iterative(self):
        stack = []
        res = []
        aux = self

        while aux or stack:
           
            while aux:
                stack.append(aux)
                aux = aux._left

            aux = stack.pop()
            res.append(aux._root)
            aux = aux._right

        return res

当我按顺序插入5、3、4、2、7、6、8构建二叉树后,调用迭代式中序遍历方法inOrder_iterative()得到的结果为:
[None, 2, None, 3, None, 4, None, 5, None, 6, None, 7, None, 8, None]
我期望得到的输出是:
[2, 3, 4, 5, 6, 7, 8]

补充的测试代码如下:

tree=BinaryTree()
tree.insert(5)
tree.insert(3)
tree.insert(4)
tree.insert(2)
tree.insert(7)
tree.insert(6)
tree.insert(8)
print('The binary tree is: ')
print('inOrder recursive', tree.inOrder())
print('inOrden iterative', tree.inOrder_iterative())

问题原因

你的迭代遍历方法没有像递归版本那样判断节点是否为空(isEmpty()),直接把所有节点的_root值加入结果列表,包括那些空节点(_root为None的BinaryTree实例)。递归版本中,遇到空节点会返回空列表,不会添加任何元素,但迭代版本里,空节点被压入栈后,弹出时会把None加入结果。

修复方法

修改inOrder_iterative()方法,在遍历过程中只处理非空节点:

修正后的代码

def inOrder_iterative(self):
    stack = []
    res = []
    aux = self

    while aux or stack:
        # 仅遍历非空的左子树,避免空节点入栈
        while not aux.isEmpty():
            stack.append(aux)
            aux = aux._left

        aux = stack.pop()
        res.append(aux._root)
        # 切换到右子树,下一轮循环会自动判断是否为空
        aux = aux._right
    return res

解释

修正后的代码在遍历左子树时,通过not aux.isEmpty()过滤掉空节点,确保只有有效节点被压入栈。弹出节点时,栈中都是非空节点,直接将_root加入结果即可。切换到右子树后,下一轮循环会再次判断右子树是否为空,避免空节点被处理,最终得到和递归版本一致的结果:[2, 3, 4, 5, 6, 7, 8]。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 02:42:51