- ベストアンサー
二分検索木でのコピー - 昨日回答0で、今日再挑戦
- 二分検索木でtree1の内容をtree2に再帰的にコピーしたいが、表示されない問題が発生しています。
- IntBSTクラスのcopyメソッドで苦労してtree1の内容を新しいオブジェクト「IntBSTNode ego」にコピーすることはできました。
- 唯一の問題は、main()でbst2.print()などを行っても何も表示されないことです。方法を教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
>bst2.print();などとやっても何も表示されません bst2のrootノードもちゃんとコピーした? nullのまんまでない? それはともかく。 以下のようすると、ちゃんと動くんでない? (※確証ない) public class IntBST { /** *「木」を複製するメソッド。 *@引数 pRoot コピー元root */ public void copyFromRoot(IntBSTNode pRoot) { root = copy(pRoot); } /** *ノードの複製を(再帰的に)作る。 *@戻り値 複製ノード */ public IntBSTNode copy(IntBSTNode source) { IntBSTNode ego=null; if(source != null) { System.out.println(source.key); //copy(source.left); //copy(source.right); //(1)source.leftの「複製」を作成 IntBSTNode l = copy(source.left); //(2)source.rightの「複製」を作成 IntBSTNode r = copy(source.right); //IntBSTNode ego = new IntBSTNode( //source.key, source.left, source.right); //新ノードegoをつくり、左右複製物を //egoのメンバ変数にセット //(することにより、結果的にtreeを構築)↓ ego = new IntBSTNode(source.key, l, r); //↑(3)これで複製完成。 System.out.println(ego.key + " Ego!"); } //return source; return ego;//複製を返す。 //※ここでegoを返り値としないと、上記(1)(2)(3)のようなことができない。 } public static void main(String[] args) { //こんな感じで使う IntBST bst2 = new IntBST(); bst2.copyFromRoot(bst1のroot); } }
お礼
ありがとうございます。 実は質問をした二時間後に自己解決してしまいました(削除しようにも一日経たないと駄目なんですね)。 kacchannさんの書かれた方法が昨日まで欲しかったんです。特に、 > public void copyFromRoot(IntBSTNode pRoot) { > root = copy(pRoot); > } と > return ego;//複製を返す です。 > bst2のrootノードもちゃんとコピーした? > nullのまんまでない? さすが、鋭いですね。そうです、私が解決した方法というのは ego = new IntBSTNode(source.key, l, r); を root = new IntBSTNode(source.key, l, r); にする方法です。 bst2で呼んでいるのでrootは既にbst2のものなんですね (てっきりrootはまだbst1のものだと思っていました)。 私のごちゃごちゃしたプログラムを見て、 修正して下さってありがとうございました!