逆ポーランド記法への変換のために2分木を作成したい
中置記法を逆ポーランド記法に変換するために中置記法を2分木に入れ後順で読んでいきたいのですが、
追加された後の根を取得することができないのでその方法を知りたいです。
追記
質問の意図はnullが戻ってきてしまう原因を教えてほしいです。
発生している問題・エラーメッセージ
要素が追加された後の根を取得したい
###実行結果
命令文入力:1 + 2 * 3 text[0] = 1 text[1] = + text[2] = 2 text[3] = * text[4] = 3 text[0+1]= + text[0]= 1 text[2+1]= * text[2]= 2 text[4]= 3 null
該当のソースコード
java
1import java.util.Scanner; 2import java.util.ArrayList; 3import java.util.List; 4import java.util.Stack; 5 6class Data{ 7 String order;//命令文 8 String num;//数値 9} 10 11public class Step3{ 12 public static void main(String[] args){ 13 Data data[] = new Data[256]; 14 15 //標準入力読み込み 16 System.out.print("命令文入力:"); 17 Scanner scan = new Scanner(System.in); 18 String line = scan.nextLine(); 19 String[] textm = line.split(" ");//空白区切り 20 21 //確認 22 for(int i=0;i<textm.length;i++){ 23 System.out.println("text[" + i + "] = " + textm[i]); 24 } 25 26 //中置記法を二分木にする 27 CheakNum cn = new CheakNum();//数字か判定 28 BinaryTree tree = new BinaryTree(); 29 Node node = new Node(null,null,null); 30 for(int i=0;i<textm.length;i++){ 31 32 if(cn.cheaknum(textm[i])){//数字の場合 33 if(i == textm.length-1){//最後の場合 34 tree.maketreeRight(node,textm[i]);//右に追加 35 System.out.println("text[" + i + "]= " + textm[i]); 36 }else{ 37 tree.maketree(node,textm[i+1]);//演算子を追加 38 System.out.println("text[" + i+1 + "]= " + textm[i+1]); 39 tree.maketree(node,textm[i]);//数字を追加 40 System.out.println("text[" + i + "]= " + textm[i]); 41 i++; 42 } 43 } 44 } 45 46 //二分木を後順で読み込む 47 List<String> list = new ArrayList<String>(); 48 list = (Search(node,list)); 49 50 String[] text = new String[256]; 51 for(int i=0;i<list.size();i++){ 52 text[i] = list.get(i); 53 } 54 } 55 56 57 public static List<String> Search(Node root, List<String> list){ 58 if(root != null){ 59 Search(root.left,list); 60 Search(root.right,list); 61 list.add(root.word); 62 //確認 63 System.out.print(" " + root.word); 64 System.out.println(); 65 } 66 return list; 67 } 68 69} 70 71 72public class BinaryTree{ 73 public static Node maketree(Node root, String text){ 74 CheakNum cn = new CheakNum(); 75 if(root == null){//空の場合 76 return new Node(text,null,null); 77 }else if(cn.cheaknum(text)){//数字の場合 78 maketree(root.left, text); 79 }else{ 80 maketree(root.right, text); 81 } 82 return root; 83 } 84 85 public static Node maketreeRight(Node root, String text){ 86 if(root == null){ 87 return new Node(text,null,null); 88 }else{ 89 maketree(root.right, text); 90 } 91 return root; 92 } 93} 94 95 96public class CheakNum{ 97 public static boolean cheaknum(String word){ 98 switch(word){ 99 case "+": 100 case "-": 101 case "*": 102 case "/": 103 return false; 104 105 default: 106 return true; 107 } 108 } 109} 110 111 112//追記 113class Node{ 114 String word; 115 Node right; 116 Node left; 117 118 Node(String word,Node left,Node right){ 119 this.word = word; 120 this.left = left; 121 this.right = right; 122 } 123}
パッと見ですが、 Node クラスがありません。
また、これだけコードを作られた後で「根が…」とはどういう訳でしょう。
処理の開始点である根から処理するようにコードを書くのが本来のはずで、それが分からなくなるコードとは一体どう作られたのでしょうか。
すみません、Node クラスは載せるのを忘れてしまいました。
「根が…」というのはBinaryTree クラスで値を木に追加しているはずなのにnullが帰ってきてしまう理由を、 return がうまく作動していないのではと考えたので、値が代入され完成した2分木の始まりを取得したいという意味です。
うまくいかない原因を勝手に決めつけてしまい質問の意図が分かりにくくなってしまっていたので、質問文を追記しました。
どこで根となる変数に値を設定しているのでしょうか。
Node node = new Node(null,null,null);
の node が根のつもりのようですが、 この代入の他に node に値を設定している個所が見当たりません。
> BinaryTree クラスで値を木に追加しているはず
どの部分のことでしょう。
指摘ありがとうございます。確かに上のコードでは木に値を追加できてないですね。
まずそこから直してみます。
回答2件
あなたの回答
tips
プレビュー