S
salamond
Hi, guys.
I'm writing a Node class for a Binary Tree.
Coding comes below.
There's a method remove_leaf.
Now I want to do it this way:
=3Dbegin
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0[@left_node, @right_node].ea=
ch do |node|
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if node.is_l=
eaf?
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
=A0node =3D nil
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0end
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0end
=3Dend
But it doesn't work.
Is there a way to do it ?
You can ignore class Tree. I just post it here to make a little sense.
---------- Forwarded message ----------
From: salamond <[email protected]>
Date: Wed, Oct 13, 2010 at 9:12 AM
Subject: ruby-talk-ask
To: (e-mail address removed)
class Node
=A0attr_accessor :value, :left_node, :right_node
=A0def initialize(value=3Dnil, left_node=3Dnil, right_node=3Dnil)
=A0 =A0@value =3D value
=A0 =A0@left_node =3D left_node
=A0 =A0@right_node =3D right_node
=A0end
=A0 =A0 =A0 =A0def to_s
=A0 =A0 =A0 =A0 =A0 =A0 =A0 [email protected]_s
=A0 =A0 =A0 =A0end
=A0 =A0 =A0 =A0def is_leaf?
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return @left_node=3D=3Dnil && @right_node=3D=
=3Dnil
=A0 =A0 =A0 =A0end
=A0 =A0 =A0 =A0def remove_leaf
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if is_leaf?
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0else
=3Dbegin
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0[@left_node, @right_node].ea=
ch do |node|
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if node.is_l=
eaf?
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
=A0node =3D nil
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0end
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0end
=3Dend
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if @left_node.is_leaf?
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0@left_node =
=3D nil
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0end
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if @right_node.is_leaf?
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0@right_node =
=3D nil
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0end
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0end
=A0 =A0 =A0 =A0end
end
require 'test/unit'
require 'node'
class NodeTest < Test::Unit::TestCase
=A0 =A0 =A0 =A0def setup
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0@empty =3D Node.new()
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0@single =3D Node.new("haha")
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0@full =3D Node.new(1, Node.new(2), Node.new(=
4))
=A0 =A0 =A0 =A0end
=A0 =A0 =A0 =A0def test_default_init()
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0assert(@empty.value=3D=3Dnil)
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0assert(@empty.left_node=3D=3Dnil)
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0assert(@empty.right_node=3D=3Dnil)
=A0 =A0 =A0 =A0end
=A0 =A0 =A0 =A0def test_init_with_value()
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0assert(@full.left_node.value=3D=3D2)
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0assert(@full.right_node.value=3D=3D4)
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0assert(@full.value=3D=3D1)
=A0 =A0 =A0 =A0end
=A0 =A0 =A0 =A0def test_to_s()
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0assert(@full.to_s =3D=3D "1")
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0assert(@single.to_s =3D=3D "haha")
=A0 =A0 =A0 =A0end
=A0 =A0 =A0 =A0def test_is_leaf()
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0assert(@empty.is_leaf? =3D=3D true)
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0assert(@single.is_leaf? =3D=3D true)
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0assert(@full.is_leaf? =3D=3D false)
=A0 =A0 =A0 =A0end
=A0 =A0 =A0 =A0def test_remove_leaf()
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0assert(@full.is_leaf? =3D=3D false)
=A0 =A0 =A0 =A0 =A0 =A0 =A0 [email protected]_leaf()
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0assert(@full.is_leaf? =3D=3D true)
=A0 =A0 =A0 =A0end
end
require "node"
class Tree
attr_accessor :root, :nodes, :sorted_nodes
def initialize( root=3Dnil )
@root =3D root
@nodes =3D Array.new()
if @root!=3D nil
@nodes.push( @root )
end
@sorted_nodes =3D Array.new()
@targets =3D Array.new()
end
def insert( node )
@nodes.push( node )
@root =3D insert_at( @root, node )
end
# TODO: to prevent multiple travel in the same way, add state check
def travel(order =3D :inorder)
@sorted_nodes =3D Array.new()
travel_at( @root, order )
return @sorted_nodes
end
def to_s
@data.to_s
end
def cut_all_leaves()
@nodes.each do |node|
node.cut_leaf
end
end
def n_step_from_leaf( n )
(1..n).each do |times|
cut_all_leaves
end
nodes =3D Array.new()
travel().each do |node|
if node.is_leaf?
nodes.push(node)
end
end
return nodes
end
private
def insert_at(subroot, node)
if subroot =3D=3D nil
subroot =3D node
else
if subroot.value >=3D node.value
subroot.left_node =3D insert_at(subroot.left_node, node)
else
subroot.right_node =3D insert_at(subroot.right_node, node)
end
end
return subroot
end
def travel_at(subroot, order)
if subroot =3D=3D nil
return
end
case order
when reorder
@sorted_nodes.push( subroot )
travel_at( subroot.left_node, order )
travel_at( subroot.right_node, order )
when :inorder
travel_at( subroot.left_node, order)
@sorted_nodes.push( subroot )
travel_at( subroot.right_node, order )
when ostorder
travel_at( subroot.left_node, order )
travel_at( subroot.right_node, order)
@sorted_nodes.push( subroot )
end
end
end
I'm writing a Node class for a Binary Tree.
Coding comes below.
There's a method remove_leaf.
Now I want to do it this way:
=3Dbegin
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0[@left_node, @right_node].ea=
ch do |node|
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if node.is_l=
eaf?
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
=A0node =3D nil
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0end
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0end
=3Dend
But it doesn't work.
Is there a way to do it ?
You can ignore class Tree. I just post it here to make a little sense.
---------- Forwarded message ----------
From: salamond <[email protected]>
Date: Wed, Oct 13, 2010 at 9:12 AM
Subject: ruby-talk-ask
To: (e-mail address removed)
class Node
=A0attr_accessor :value, :left_node, :right_node
=A0def initialize(value=3Dnil, left_node=3Dnil, right_node=3Dnil)
=A0 =A0@value =3D value
=A0 =A0@left_node =3D left_node
=A0 =A0@right_node =3D right_node
=A0end
=A0 =A0 =A0 =A0def to_s
=A0 =A0 =A0 =A0 =A0 =A0 =A0 [email protected]_s
=A0 =A0 =A0 =A0end
=A0 =A0 =A0 =A0def is_leaf?
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return @left_node=3D=3Dnil && @right_node=3D=
=3Dnil
=A0 =A0 =A0 =A0end
=A0 =A0 =A0 =A0def remove_leaf
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if is_leaf?
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0else
=3Dbegin
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0[@left_node, @right_node].ea=
ch do |node|
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if node.is_l=
eaf?
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0=
=A0node =3D nil
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0end
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0end
=3Dend
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if @left_node.is_leaf?
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0@left_node =
=3D nil
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0end
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if @right_node.is_leaf?
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0@right_node =
=3D nil
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0end
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0end
=A0 =A0 =A0 =A0end
end
require 'test/unit'
require 'node'
class NodeTest < Test::Unit::TestCase
=A0 =A0 =A0 =A0def setup
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0@empty =3D Node.new()
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0@single =3D Node.new("haha")
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0@full =3D Node.new(1, Node.new(2), Node.new(=
4))
=A0 =A0 =A0 =A0end
=A0 =A0 =A0 =A0def test_default_init()
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0assert(@empty.value=3D=3Dnil)
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0assert(@empty.left_node=3D=3Dnil)
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0assert(@empty.right_node=3D=3Dnil)
=A0 =A0 =A0 =A0end
=A0 =A0 =A0 =A0def test_init_with_value()
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0assert(@full.left_node.value=3D=3D2)
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0assert(@full.right_node.value=3D=3D4)
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0assert(@full.value=3D=3D1)
=A0 =A0 =A0 =A0end
=A0 =A0 =A0 =A0def test_to_s()
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0assert(@full.to_s =3D=3D "1")
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0assert(@single.to_s =3D=3D "haha")
=A0 =A0 =A0 =A0end
=A0 =A0 =A0 =A0def test_is_leaf()
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0assert(@empty.is_leaf? =3D=3D true)
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0assert(@single.is_leaf? =3D=3D true)
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0assert(@full.is_leaf? =3D=3D false)
=A0 =A0 =A0 =A0end
=A0 =A0 =A0 =A0def test_remove_leaf()
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0assert(@full.is_leaf? =3D=3D false)
=A0 =A0 =A0 =A0 =A0 =A0 =A0 [email protected]_leaf()
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0assert(@full.is_leaf? =3D=3D true)
=A0 =A0 =A0 =A0end
end
require "node"
class Tree
attr_accessor :root, :nodes, :sorted_nodes
def initialize( root=3Dnil )
@root =3D root
@nodes =3D Array.new()
if @root!=3D nil
@nodes.push( @root )
end
@sorted_nodes =3D Array.new()
@targets =3D Array.new()
end
def insert( node )
@nodes.push( node )
@root =3D insert_at( @root, node )
end
# TODO: to prevent multiple travel in the same way, add state check
def travel(order =3D :inorder)
@sorted_nodes =3D Array.new()
travel_at( @root, order )
return @sorted_nodes
end
def to_s
@data.to_s
end
def cut_all_leaves()
@nodes.each do |node|
node.cut_leaf
end
end
def n_step_from_leaf( n )
(1..n).each do |times|
cut_all_leaves
end
nodes =3D Array.new()
travel().each do |node|
if node.is_leaf?
nodes.push(node)
end
end
return nodes
end
private
def insert_at(subroot, node)
if subroot =3D=3D nil
subroot =3D node
else
if subroot.value >=3D node.value
subroot.left_node =3D insert_at(subroot.left_node, node)
else
subroot.right_node =3D insert_at(subroot.right_node, node)
end
end
return subroot
end
def travel_at(subroot, order)
if subroot =3D=3D nil
return
end
case order
when reorder
@sorted_nodes.push( subroot )
travel_at( subroot.left_node, order )
travel_at( subroot.right_node, order )
when :inorder
travel_at( subroot.left_node, order)
@sorted_nodes.push( subroot )
travel_at( subroot.right_node, order )
when ostorder
travel_at( subroot.left_node, order )
travel_at( subroot.right_node, order)
@sorted_nodes.push( subroot )
end
end
end