假设:
- 二叉树实际上是根节点
- child_nodes 以数组形式返回子节点的集合
class BinaryNode
attr_reader :element
def initialize(element,lchild,rchild)
@element, @lchild, @rchild = element, lchild, rchild
end
def height
if @lchild.nil? && @rchild.nil?
return 0
else
[@lchild, @rchild].collect {|n| n.nil ? 0 : n.height + 1 }.max
end
end
def deepest_nodes
return [self] if self.height == 1
[@lchild, @rchild].select {|n| !n.nil? && (n.height == self.height - 1)}.collect {|n| n.deepest_nodes}.flatten
end
end
重构:
class BinaryNode
attr_reader :element
def initialize(element,lchild,rchild)
@element, @lchild, @rchild = element, lchild, rchild
end
def child_nodes
[@lchild, @rchild].compact
end
def height
if self.child_nodes.empty?
return 0
else
self.child_nodes.collect {|n| n.height + 1 }.max
end
end
def deepest_nodes
return [self] if self.depth == 1
self.child_nodes.select {|n| n.height == self.height - 1}.collect {|n| n.deepest_nodes}.flatten
end
end
获取元素:
BinaryNode.new(1,BinaryNode.new(2,leaf,leaf),BinaryNode.new(3,leaf,leaf)).deepest_nodes.collect {|n| n.element }