none
Win32API ツリーの解析について RRS feed

  • 質問

  • Win32APIにおけるツリーの解析についての質問です.

    ツリーコントロール中のノード構造を,ベクタ配列として表したいのですが何か良い方法がありますか?

     

    作成したプログラムについて言いますと,

    まず,ノード名を入力します.

    そして,ノードを任意の位置に追加し,入力したノード名でツリー構造を作成するものです.

    ここで,ツリーコントロール中のノードに表示しているノード名をノードの構造通りに

    ベクタ配列で表したいのですが,うまくいきません.

    どなたかアドバイスをお願いします.

     

    2011年12月16日 4:44

回答

  • 一般に均質な樹状構造は、メンバに自身の配列を持つ構造で表します。
    (例)---
    class NODE;
    typedef CArray<NODE>  NODE_ARY;
    class NODE
    {
     protected:
        NODE_ARY   m_Child_Node_Ary; // 子分の配列
    };
    てな感じ。「ベクタ」でなくてごめんね(笑)。

    2011年12月16日 6:25

すべての返信

  • 階層構造をどのように配列に展開したいのか説明がないのでアドバイスしようがないです。
    >うまくいきません.
    「うまくいきません」ではなく「なにをしてどううまくいかないのか」を説明してください。
    2011年12月16日 5:44
  • 一般に均質な樹状構造は、メンバに自身の配列を持つ構造で表します。
    (例)---
    class NODE;
    typedef CArray<NODE>  NODE_ARY;
    class NODE
    {
     protected:
        NODE_ARY   m_Child_Node_Ary; // 子分の配列
    };
    てな感じ。「ベクタ」でなくてごめんね(笑)。

    2011年12月16日 6:25
  • 他の方も書かれておられますが、

    ツリー構造のデータを一次元の配列一つで表現しようとしているのであれば、
    単純に並べるだけでは無理だと思います。
    ノードの親子関係を表現する必要があるからです。
    何らかの規則性とか文字列以外にノード間の関係がわかるような情報をセットしないと表現できません。
    一番素直な実装方法は、仲澤@失業者さんが書かれているようにクラスを使って親子関係を表現できるように
    実装する方法でしょう。直感的でわかりやすい実装だと思います。

    どうしてもベクタ配列で表現したいとしても単純にstringのベクタでは駄目でなんらかの情報と文字列をセットで
    扱うようなクラスを作成してそのクラスのベクタ配列にする必要があるのでは?
    どうして一般的な実装ではなくてベクタ配列で表現したいのかが説明されていないのでなんともですが、
    もし、ご自分の勉強の為にベクタ配列で表現しようとしているのであれば、自分で考え無いと意味が無いと思います。
    ベクタ配列で表現する事に必然が無いのであれば、仲澤@失業者さんが言われているようにツリー構造を
    表現する為のクラスを作成して表現する方が自然ですし、C++的にも納得が行くと思いますよ。

    特別な理由が無いのであれば、わざわざ歪んだ実装をするだけバグが出やすくなるので良い実装とは言えないと思います。


    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    • 編集済み PATIO 2011年12月16日 8:10
    2011年12月16日 8:08
  • ツリー構造のデータを一次元の配列一つで表現しようとしているのであれば、

    単純に並べるだけでは無理だと思います。

    一番素直な実装方法は、仲澤@失業者さんが書かれているようにクラスを使って親子関係を表現できるように
    実装する方法でしょう。直感的でわかりやすい実装だと思います。

    こってり太郎さんがやりたいのはツリーコントロールの解析なので、ツリーコントロールという形ですでにデータ構造は存在してます。

    そのうえでそれを探索する(ベクターにノードを突っ込んでいく)方法で悩んでるのだと思います。

     


    • 編集済み galaco 2011年12月16日 8:30
    2011年12月16日 8:29
  • すみません,ツリーを作成後,解析するための再帰メソッド中で,

    どうベクタに突っ込めばよいかわからないということです.

    2011年12月16日 11:18
  • まず,質問の説明が足らなくてすみません.

    「ツリーの構築の機能で,後から編集できるように,ノードの削除などを機能を追加しました.

    そのため,ツリーの構造が完全に決まってから,再帰プログラムでツリーの解析を行っていました.

    だから,その解析メソッドのなかでどのようにベクタ配列中に代入すればよいのかわからなかったのですが,」

    仲澤@失業者さんのコメントを読ませていただいているうちにわかったのですが,

    ノード用のクラスを定義し,プログラムでノードの追加・削除を行っている場所で,同時に

    ノードのインスタンスに追加・削除を行ってやればできそですね.

    大変参考になりました.ありがとうございます.

     

    2011年12月16日 11:27
  • 確かに,おっしゃる通りです.

    私のコメントが足りず,申し訳ないです.

    2011年12月16日 11:29
  • 回答ありがとうございます.

    クラスを用いて行ってみます.

     

    2011年12月16日 11:32
  • 配列に入れる方法はわからなくても、最終的にどのように並んでいるかは検討済みですよね?その内容を聞いているのです。
    親親親子子子孫孫孫 と並べたいのか、親子孫親子孫親子孫 と並べたいのか、それがわからないとアドバイスできないのです。
    ちなみに後者の場合は、ツリーの最上位ノードに対して以下の処理をします。
    AddList(node) {
      node を配列に入れる。
      
      (node の子ノードのループ)
      {
        AddList(子node);
      }
    }
    


    2011年12月16日 11:35
  • 「解析」が目的なのは承知していますが、その影響により構造の
    選択が異なりますね。
     1.データの「解析が」樹状構造自体に影響を与える場合、
      -> 樹状構造のまま解析にかけなければならない。
      -> 又は、結果を保管する構造を別に定義しなければならない。
     2.そうでない場合は
      -> 一旦1次元の配列なりベクタなりに展開してから解析しても良い。

    そのとき注意しなければならないのは、
     3.Tree Ctrlは表現手段なのであって、データそのものとは本質的に関係ない。
       加えて、コントロールに対する、取得/設定は大きなコストがかかる。

    ことですね。一般に、
     (A) 対象データの本質的構造を導き出す。
     (B) 処理に都合の良い形式に、データ構造を修正する(本質は変えない)。
     (C) 処理に見合った表現方法と、操作方法を検討する。
    の順で考えると良いかもしれません。

    2011年12月19日 3:42
  • もしかして、この話?

    http://www.infor.kanazawa-it.ac.jp/~koblab/home/d1504310/acm/dochtml/40_.html

    探索順序が決まれば、それを配列インデックスに使えるよね。

    2011年12月21日 1:32