我正在研究一种递归算法,将二叉树展平为单链表。问题陈述:
Given a binary tree, flatten it to a linked list in-place.
For example,
Given
1
/ \
2 5
/ \ \
3 4 6
The flattened tree should look like:
1
\
2
\
3
\
4
\
5
\
6
我编写了以下递归代码,但根本不起作用(返回错误的答案),但我无法从概念上理解为什么不这样做。从根开始,我们将root.left和root.right展平。如果root.left存在,则root.next(或者在本例中为root.right)将指向展平的左侧列表。然后,左侧列表指向右侧列表的开头。这将继续递归到树下。
这在概念上有问题吗?我尝试在预先遍历遍历后对其进行建模,因为基本上是访问了root,然后是left,然后是右边。
def flatten(root)
return root if root.nil?
left_list = flatten(root.left)
right_list = flatten(root.right)
root.left = nil
root.right = (left_list.nil? ? right_list : left_list)
find_tail(left_list).right = right_list unless left_list.nil?
end
def find_tail(node)
return nil if node.nil?
until node.right.nil?
node = node.right
end
node
end
答案 0 :(得分:0)
您的flatten
未返回应有的内容。你递归地称之为重要。将其更改为
...
find_tail(left_list).right = right_list unless left_list.nil?
root # <-- add this line
end