在我的解决方案中,我遇到了一个“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)
给定节点类:
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编程技巧总结》