###前提・実現したいこと
Java言語の初心者です.
クラスの再帰を利用した2分木をで挿入・表示を行おうとしているのですが, 挿入がうまくできません.
C言語では, 2分木を扱ったことがあるのですがあっちはポインタなので新しく勉強中です.
###発生している問題・エラーメッセージ
Java, 環境はEclipse Neon 4.6
まず, サイトを参考にして手作業で木を作成し(コメントで除外した部分)、表示させることは出来ました.
しかし, ランダムに表れた数字を2分木に格納しようとしたときに問題が生じました.
ソースコードの【問題箇所】とコメントしているメソッドとfor文に問題があります.
メソッドを再帰させtreeを辿って, 該当箇所に新しくクラスをインスタンス化し, コンストラクタを使用してtree.dataに数字を代入しています.
本当なら, 表示させたときに入れた数字がすべて表示されるはずなのですが上手くいきません. 恐らく, 正しく木を生成できていないと思います.
2時間ほど考えたのですが全くわからないので質問させていただきました.
###該当のソースコード
java
1import java.util.Random; 2 3/* 4 * Javaによる二分木の実装例 5 */ 6 7class TreeNode{ 8 //中身の宣言 9 int data; 10 TreeNode left; 11 TreeNode right; 12 13 //コンストラクタ(生成時に引数とする初期化方法) 14 TreeNode (int data, TreeNode left, TreeNode right){ 15 this.data = data; 16 this.left = left; 17 this.right = right; 18 } 19} 20 21public class TreeTraverse { 22 public static void main (String[] args) { 23 24 //Randomクラスのインスタンス化 25 Random Rnd = new Random(); 26 27 //ダミーの初期化 28 int DUMMY = 5; 29 30 //頑張って格納 31 32 TreeNode tree = new TreeNode(DUMMY, null, null); 33 34 /*除外 35 tree.right = new TreeNode(6, null, null); 36 tree.right.left = new TreeNode(2, null, null); 37 tree.right.right = new TreeNode(3, null, null); 38 tree.right.left.left = new TreeNode(4, null, null); 39 tree.right.left.right = new TreeNode(5, null, null); 40 tree.right.right.left = new TreeNode(6, null, null); 41 tree.right.right.right = new TreeNode(7, null, null); 42 tree.right.left.left.left = new TreeNode(8, null, null); 43 tree.right.left.left.right = new TreeNode(9, null, null); 44 */ 45 46 //【問題箇所】ダミーを5に設定し、0~10までの数字をランダムに10つ二分木に格納してみる 47 int N = 10; 48 int num = 0; 49 for(int i = 0;i<N;i++){ 50 num = Rnd.nextInt(10); 51 System.out.println(num + "\n"); 52 input(tree, num); 53 } 54 55 System.out.print("Preorder: "); 56 preorder(tree.right); 57 System.out.println(); 58 System.out.print("Inorder: "); 59 inorder(tree.right); 60 System.out.println(); 61 System.out.print("Postorder: "); 62 postorder(tree.right); 63 System.out.println(); 64 } 65 66//【問題箇所】 67static void input(TreeNode tree, int num){ 68 if(tree == null){ 69 tree = new TreeNode(num, null, null); 70 System.out.println(tree.data + " put\n"); 71 }else if(tree.data <= num){ 72 System.out.println("moved right.\n"); 73 input(tree.right, num); 74 }else if(tree.data >= num){ 75 System.out.println("moved left.\n"); 76 input(tree.left, num); 77 } 78} 79 80static void preorder (TreeNode tree) { 81 if (tree != null) { 82 System.out.print(" " + tree.data); 83 preorder(tree.left); 84 preorder(tree.right); 85 } 86} 87 88static void inorder (TreeNode tree) { 89 if (tree != null) { 90 inorder(tree.left); 91 System.out.print(" " + tree.data); 92 inorder(tree.right); 93 } 94} 95 96static void postorder (TreeNode tree) { 97 if (tree != null) { 98 postorder(tree.left); 99 postorder(tree.right); 100 System.out.print(" " + tree.data); 101 } 102 } 103} 104
###試したこと
デバッグするために, mainメソッドからtree.right.dataなどを表示させてみたのですがそもそも最初のダミー部分以外, インスタンス化できていないようです.
しかし, その理由がいくら考えてもわかりません.
###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
回答4件
あなたの回答
tips
プレビュー