【问题标题】:Level Order Traversal Binary Tree Issue级别顺序遍历二叉树问题
【发布时间】:2017-08-01 07:25:12
【问题描述】:

问题陈述:

给定一棵二叉树,返回其节点的层序遍历' 价值观。 (即从左到右,逐级)。

For example:
Given binary tree [3,9,20,null,null,15,7],
    3
   / \
  9  20
    /  \
   15   7
return its level order traversal as:
[
  [3],
  [9,20],
  [15,7]
]

我已经用 BFS 解决了这个问题,这是最直观的方法。但是,我尝试以另一种方式解决它,但我无法解决。以下是示例输入/正确输出与我的输出:

Your input
[3,9,20,null,null,15,7]

Your answer
[[3],[[9],[],[20],[[15],[],[7],[]]]]

Expected answer    
[[3],[9,20],[15,7]]

这显然是因为代码 [] 中的某处被返回,但这是我的代码:

def level_order(root)
    return [] if root.nil?

    arr = merge([level_order(root.left)], [level_order(root.right)]) #this returns an empty arr if both of those are nil..
    arr.insert(0, [root.val]) 
end

def merge(arr1, arr2)
    i = j = 0
    while i < arr1.length && j < arr2.length
        arr1[i] += arr2[j]
        i += 1
        j += 1
    end
    while j < arr2.length #check if any remaining elements in arr 2
        arr1 << arr2[j]
        j += 1
    end

    arr1
end

在上面,我通过 += 而不是

我还认为可以将根作为空数组插入,但这不可能发生,因为我有一个初始返回语句,如果根为 nil 则调用该语句。有什么想法吗?

【问题讨论】:

标签: ruby algorithm recursion binary-tree tree-traversal


【解决方案1】:

应该像改变这个一样简单

arr = merge([level_order(root.left)], [level_order(root.right)]) 

arr = merge(level_order(root.left), level_order(root.right))

但是我会写这个稍微不同:

input = [3,9,20,nil,nil,15,7]

output = []
start  = 0
length = 1
while start < input.length do
  output << input.slice(start, length).compact
  start  += length
  length *= 2  
end

puts output.inspect

这将避免构建树并且比递归更有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    相关资源
    最近更新 更多