よもやまのC#時折CPP

MFC,C# .Net,CPP,and ....

目次

Blog 利用状況

ニュース

わんくま同盟

わんくま同盟

投稿カレンダー

iKnow始めました

書庫

日記カテゴリ

C#で2分木アルゴリズムに挑戦 - Part3 -

それなりの雰囲気ができたので・・

public class BTreeNode  {
    protected int m_Key;
    protected T2 m_NodeData;
    //
    protected BTreeNode m_Parent;
    protected BTreeNode m_Left;
    protected BTreeNode m_Right;
    public int Key {
        get { return m_Key; }
        set { m_Key = value; }
    }
    public T2 NodeData {
        set { m_NodeData = value; }
        get { return m_NodeData; }
    }
    public BTreeNode(int key, T2 data)
    {
        this.m_Key = key;
        this.m_NodeData = data;
    }
    public BTreeNode()
    {
    }
    public void GenerateTree(BTreeNode insData) {
        this.m_Parent = GenerateTree(this, insData);
    }
    protected BTreeNode GenerateTree(BTreeNode leaf, BTreeNode insdata) {
        if (leaf == null) {
            leaf = new BTreeNode(insdata.Key, insdata.NodeData);
            leaf.m_Left = null;
            leaf.m_Right = null;
        }
        else if ( this.Key < insdata.Key ) {
            leaf.m_Left = GenerateTree(leaf.m_Left, insdata);
            leaf.m_Left.m_Parent = this;
        }
        else {
            leaf.m_Right = GenerateTree(leaf.m_Right, insdata);
            leaf.m_Right.m_Parent = this;
        }
        return leaf;
    }
    public void WalkWatch() {
        Walk(this);
    }
    protected  void Walk(BTreeNode root){
        if ( root != null ) {
            Walk(root.m_Right);
            string buffer;
            buffer = "[";
            buffer += root.Key.ToString();
            buffer += "]" + root.NodeData;
            Console.WriteLine(buffer);
            Walk(root.m_Left);
        }
    }
}

 

おためし・・

static void Main(string[] args)
{
    BTreeNode TreeBase = new BTreeNode(50,"よもやま");
    BTreeNode TreeNode = new BTreeNode();
    BTreeNode TreeNode2 = new BTreeNode();
    TreeNode.Key = 25;
    TreeNode.NodeData = "hoge25";
    //
    TreeBase.GenerateTree(TreeNode);
    //
    TreeNode2.Key = 70;
    TreeNode2.NodeData = "hoge70";
    TreeBase.GenerateTree(TreeNode2);
    //
    TreeNode2.Key = 60;
    TreeNode2.NodeData = "hoge60";
    TreeBase.GenerateTree(TreeNode2);
    //
    TreeNode2.Key = 40;
    TreeNode2.NodeData = "hoge40";
    TreeBase.GenerateTree(TreeNode2);
    //
    TreeBase.WalkWatch();
}

これからの自己課題

  • キーの大小関係比較のため、内部intにしてしまった
  • Tree内部データを追いかける処理(WalkとかWalkWatch)がクラス内部にある事

う~ん。作ってみたはいいけれど、どうも自分の作ったコードに釈然としない。。。
まだまだ修行が足りないようです(^^;
#2007/10/8 LIタグ修正

投稿日時 : 2007年9月17日 22:53

コメントを追加

# re: C#で2分木アルゴリズムに挑戦 - Part3 - 2007/09/18 12:56 凪瀬

キーの比較は、比較用のオブジェクトを別途用意することで自在なソート順を外から与えることができます。

public int Compare(object x, object y){...}

というようなメソッドをもつインターフェースがあれば、キーの大小比較は自由自在ですよね。
この概念がSystem.Collections.IComparerとなります。

Treeを辿るのにはVisitorパターンがお勧めです。
ややこしいコードになるのですが、追加・削除といった処理の違いをclassの実装の違いで表現できるのでTreeの操作には向いていますよ。

# re: C#で2分木アルゴリズムに挑戦 - Part3 - 2007/09/18 15:23 επιστημη

もしくは System.Comparion<T> デリゲート。

# re: C#で2分木アルゴリズムに挑戦 - Part3 - 2007/09/18 23:16 よもやま

>キーの比較は、比較用のオブジェクトを別途用意することで自在なソート順を外から与えることができます。
>public int Compare(object x, object y){...}
>というようなメソッドをもつインターフェースがあれば、キーの大小比較は自由自在ですよね。
>この概念がSystem.Collections.IComparerとなります。
>Treeを辿るのにはVisitorパターンがお勧めです。
>ややこしいコードになるのですが、追加・削除といった処理の違いをclassの実装の違いで表現できるのでTreeの操作には向いていますよ。
調べて試行錯誤して頑張ります。

>もしくは System.Comparion<T> デリゲート。
デリゲートまだ使ったことないのですが
いろいろ使い道がありそうなので、勉強します。





タイトル
名前
URL
コメント