二分木のメソッド(続き) 中間順に木をなぞるメソッド 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クラスのメソッドにならない
© Copyright 2024 ExpyDoc