展平二叉树 - >单链表(Ruby)

时间:2017-02-21 18:34:15

标签: ruby algorithm recursion linked-list tree

我正在研究一种递归算法,将二叉树展平为单链表。问题陈述:

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

1 个答案:

答案 0 :(得分:0)

您的flatten未返回应有的内容。你递归地称之为重要。将其更改为

    ...
    find_tail(left_list).right = right_list unless left_list.nil?
    root  # <-- add this line
end