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

LeetCode二叉搜索树转循环双链表Python代码报错排查

LeetCode题解:二叉搜索树转排序循环双链表报错排查

题目要求

原地将二叉搜索树转换为排序循环双链表。可将节点的left、right指针对应双链表的前驱、后继指针;循环双链表中首节点的前驱为尾节点,尾节点的后继为首节点。

当前已实现的版本自测时值的顺序、双向指向的输出值看似正确,但提交始终报错:

链表[1,2,3,4,5]不是有效的循环双链表。

原有问题代码

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

def inOrderTraversal(node, array):
    if node == None:
        return

    inOrderTraversal(node.left, array)
    array.append(node.val)
    inOrderTraversal(node.right, array)
    return array


class Solution:
    def treeToDoublyList(self, root: 'Optional[Node]') -> 'Optional[Node]':
        if root is None:
            return None
        array = []
        inOrderTraversal(root, array)

        head = Node(array[0])
        head.left = Node(array[-1])
        prev_node = head

        for i in range(1, len(array)):
            num = array[i]
            node = Node(num)


            prev_node.right = node     
            node.left = prev_node
            prev_node = node

            if i == len(array) - 1:
                node.right = head


        count = 0
        node = head
        while count < 5:
            print("new Test")
            print(node)
            print(node.left.val)
            print(node.right.val)
            node = node.right
            count += 1

       # print(head.right.val)

        return head

调试输出

new Test
<__main__.Node object at 0x7f0318a062c0>
5
2
new Test
<__main__.Node object at 0x7f0318a06a40>
1
3
new Test
<__main__.Node object at 0x7f0318a06c20>
2
4
new Test
<__main__.Node object at 0x7f0318a3e680>
3
5
new Test
<__main__.Node object at 0x7f0318a3e6e0>
4
1

错误原因

你的代码有两个核心问题,直接导致校验不通过:

  • 违反原地修改要求:题目要求直接调整原树节点的指针完成转换,你在中序遍历拿到节点值后,全部新建了Node对象拼接链表,完全没有复用原二叉树的节点,测试框架校验节点身份时会直接判定结果无效。
  • 循环链路断裂:你给头节点设置left指针时,单独新建了一个值为5的节点,这个节点和循环最后生成的值为5的尾节点根本不是同一个对象;同时你只给尾节点设置了right指向头节点,既没有把尾节点的left正确指向值为4的前序节点,也没有把头节点的left指向真正的尾节点,只是指向了一个孤立的值为5的新节点,不满足循环双链表的双向闭环要求。
    你的调试输出只打印了节点的val,没有发现两个值为5的节点内存地址完全不同,看起来值是对的,实际指针连的是完全不相关的对象。

修正后可通过代码

不用改动整体逻辑,只需要把中序遍历存节点值改为存原节点引用,全程不新建Node对象即可:

class Solution:
    def treeToDoublyList(self, root: 'Optional[Node]') -> 'Optional[Node]':
        if root is None:
            return None
        node_list = []
        # 中序遍历直接存储原树节点
        def inOrder(node):
            if not node:
                return
            inOrder(node.left)
            node_list.append(node)
            inOrder(node.right)
        inOrder(root)

        head = node_list[0]
        prev = head
        for i in range(1, len(node_list)):
            cur = node_list[i]
            prev.right = cur
            cur.left = prev
            prev = cur
        # 首尾相连形成闭环
        tail = prev
        head.left = tail
        tail.right = head
        return head

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 22:06:25