それなりの雰囲気ができたので・・
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タグ修正