当前位置: 首页 > 知识库问答 >
问题:

转换二进制搜索树到排序双链表

陈康胜
2023-03-14

在我的解决方案中,我遇到了一个“None's not have.val”的问题。。。我想知道如何调试它。。。

以下是描述

将BST转换为已排序的循环双链接列表。将左指针和右指针视为双链接列表中上一个和下一个指针的同义词。]

让我们以下面的BST为例,它可能会帮助您更好地理解这个问题:我们希望将这个BST转换为一个循环双链接列表。双链表中的每个节点都有一个前导节点和后继节点。对于循环双链表,第一个元素的前一个元素是最后一个元素,最后一个元素的后一个元素是第一个元素。

下图显示了上述BST的循环双链接列表。“head”符号表示它指向的节点是链表中最小的元素。

https://www.lintcode.com/problem/convert-binary-search-tree-to-sorted-doubly-linked-list/description

说明:左:反向输出右:正序输出

我的代码:

class Solution:
    """
    @param root: root of a tree
    @return: head node of a doubly linked list
    """
    def treeToDoublyList(self, root):
        # Write your code here.
        if not root: 
            return None
        
        prev = node(0)
        self.treeToDoublyList(root.left)
        
        if prev is None:
            
            prev = root
        else:
            prev.left = root
            root.right = prev
        
        
        
        
        self.treeToDoublyList(root.right)

共有1个答案

姜德容
2023-03-14

给定节点类:

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

...您可以首先定义一个按顺序生成节点的函数:

class Solution:
    def inorder(self, tree):
        if tree.left:
            yield from self.inorder(tree.left)
        yield tree
        if tree.right:
            yield from self.inorder(tree.right)   

然后main函数的实现变成花生:

    def treeToDoublyList(self, root):
        if not root:
            return
        prev = None
        for curr in self.inorder(root):
            # Create double link between prev and curr
            if prev:
                prev.right = curr
            else:
                head = curr
            curr.left = prev
            # Prepare for next iteration
            prev = curr
        # Close the cycle
        curr.right = first
        head.left = curr
        return head

为了测试双链表,您可以再定义两个函数:

    def forward(self, head):
        node = head
        yield node.val
        while node.right != head:
            node = node.right
            yield node.val

    def backward(self, head):
        node = head
        yield node.val
        while node.left != head:
            node = node.left
            yield node.val

按如下方式调用这些函数:

sol = Solution()
# Example tree
tree =  Node(4, 
            Node(2, 
                Node(1), Node(3)
            ),
            Node(5)
        )
res = sol.treeToDoublyList(tree)
print(list(sol.forward(res)))  # [1, 2, 3, 4, 5]
print(list(sol.backward(res)))  # [1, 5, 4, 3, 2]
 类似资料:
  • 这个问题是在最近的一次编码采访中被问到的。 问:给定一个二叉树,写一个程序把它转换成双链表。双链表中的节点按zig-zag级顺序遍历形成的序列排列

  • 一个痛苦而愚蠢的问题,我几乎羞于不敢问。在过去的4个小时里,我一直在寻找,测试了不同的算法,在纸上尝试了不少,但仍然无法正常工作。 我将为您提供项目实现的详细信息,但基本问题是:“如何处理在预排序二叉树中插入节点。 通过预排序BST,我的意思是所有节点都应该以这样的方式插入,即使用预排序遍历(例如用于打印)遍历树时,应该按升序打印节点。 我只需要一个简单的算法。我尝试了这里给出的一个简单的插入算法

  • 我想把一个排序的整数数组转换成一个二叉搜索树。我相信我知道该怎么做。我已经在下面发布了我的伪代码。我无法想象的是递归实际上是如何工作的。 如果我的数组是1,2,3,4,5。。。我首先将3作为我的BST的根,然后将2作为3的左子节点。那么我要把1设为2的左子节点,然后返回到2吗?我不明白递归是如何贯穿整个过程的。。。 提前感谢,如果这个问题解释得不好,请道歉。我不想要显式的代码,但如果有人能帮我解释

  • 我想实现一种将排序数组插入二叉搜索树的算法,但我不希望最终得到一棵只向一侧生长的树。 你有什么想法吗? 谢谢你。

  • 本文向大家介绍Python二叉搜索树与双向链表转换算法示例,包括了Python二叉搜索树与双向链表转换算法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python二叉搜索树与双向链表转换算法。分享给大家供大家参考,具体如下: 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 普通的二叉树也可以转换成双向链表

  • 本文向大家介绍Python二叉搜索树与双向链表转换实现方法,包括了Python二叉搜索树与双向链表转换实现方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python二叉搜索树与双向链表实现方法。分享给大家供大家参考,具体如下: 更多关于Python相关内容可查看本站专题:《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python Socket编程技巧总结》