二分木のメソッド(続き)

二分木のメソッド(続き)
中間順に木をなぞるメソッド
class Vertex
def initialize …
attr_attribute :data, :left, :right
def inorder
# 中間順でなぞる
@left.inorder if @left != nil
# vの左の子をなぞる
print @data
# 頂点のラベルを表示
@right.inorder if @right != nil # vの右の子をなぞる
end # def of inorder
end # class
先行順、後行順に木をなぞるメソッド
class Vertex
def initialize …
attr_attribute :data, :left, :right
def preorder
# 後行
中間順でなぞる
postorder
inorder
先行
@left.preorder
@left
!=
nil
vの左の子をなぞる
@left.inorder ififif@left
@left.postorder
@left!=
!=nil
nil ###vの左の子をなぞる
vの左の子をなぞる
print
## 頂点のラベルを表示
print @data
@data
頂点のラベルを表示
@right.inorder ifif @right
@right.preorder
@right.postoder
@right !=
!= nil
nil ###vの右の子をなぞる
vの右の子をなぞる
vの右の子をなぞる
end # def
end # class
「高さ」を返すメソッド
この木の高さは?
左部分木の高さ と
右部分木の高さ
の大きい方+1
左部分木の高さ=
@left.height
右部分木の高さ=
@left.height
ただし子がいない時も考慮すること
(例えば両方とも子がいない=葉の場合は、高さ0!)
考えるべきケース
(1) 子ノードがない場合:
これは高さ 0
(2) 左(または右)の子ノードだけがある場合
子ノードを根とする
部分木の高さ+1
(3) 両方の子がある場合
左子ノードを根とする部分木の高さ
右子ノードを根とする部分木の高さ
の大きいほう+1 (前のスライド参照)
「高さ」を返すメソッド(続)
class Vertex
def initialize …
attr_attribute :data, :left, :right
def height
if (@left != nil)
# 左の子あり
leftHeight = @left.height
elsif (@right != nil) # 左の子なし、右の子あり
return [email protected]
else
# 左の子も右の子もなし
return 0 # 葉
end # if --- 左の子がある場合のみ残る if (leftHeight > rightHeight)
return 1+leftHeight
if (@right != nil) # 右の子あり
else
rightHeight = @right.height
return 1+rightHeight
else # 右の子なし
end # if
return 1+leftHight
end # def
end # if --- 二つの子あり
end # class
葉を表示するメソッド
class Vertex
def initialize …
attr_attribute :data, :left, :right
def inorder
# 中間順でなぞる
@left.inorder if @left != nil
# vの左の子をなぞる
print @data
# 頂点のラベルを表示
@right.inorder if @right != nil # vの右の子をなぞる
end # def of inorder
end # class
このままだと「葉」以外の頂点も表示
そこで「葉」の条件を加えれば良い
それは、子頂点がないこと!
print @data if (@left == nil) && (@right == nil)
注意:showが返す「配列」から求めても良いが、Vertexクラスのメソッドにならない