Javaを使用してSystem.inにパイプされた文字列入力からバイナリツリーを構築しようとしています。文字列にazからの文字が含まれる場合は常に、内部ノード(2つの子を持つ)を作成しています。文字列で0が検出されるたびに、外部ノード(リーフ)を作成します。文字列はプレオーダーであるため、例として、次のような入力があった場合:
abcd000e000
次の二分木を作ることになっています
a / \ b 0 / \ c e / \ / \ d 00 0 / \ 0 0
少なくとも、それは私が割り当ての詳細(以下のリンクにある)に従って作成することになっていると私が思うものです。プログラム全体のサンプル入力と出力も提供されました。
入力
a0
0
a00
ab000
出力
ツリー1:
無効です!
ツリー2:
高さ:-1
パス長:0
完了:はい
ポストオーダー:
ツリー3:
高さ:0
パス長:0
完了:はい
ポストオーダー:a
ツリー4:
高さ:1
パス長:1
完了:はい
ポストオーダー:ba
Javaでこれを行うプログラムを実装しようとしていますが、バイナリツリーを正しく作成していないと思います。私はこれまでに思いついたコードを提供し、デバッグ中にこれまでに遭遇した問題を各メソッドの上のコメントで詳しく説明しました。より多くのコンテキストが必要な場合は、次のリンクで割り当て全体と最終的な目標を詳しく説明します(バイナリツリーの構築は最初のステップにすぎませんが、私はそれに固執しています)。
import java.io.*;
// Node
class TreeNode {
char value;
TreeNode left;
TreeNode right;
}
// Main class
public class btsmall {
// Global variables
char[] preorder = new char[1000];
int i = 0;
// Main method runs gatherOutput
public static void main(String[] args) throws IOException {
new btsmall().gatherOutput();
}
// This takes tree as input from the gatherOutput method
// and whenever a 0 is encountered in the preorder character array
// (from a string from System.in) a new external node is created with
// a value of 0. Whenever a letter is encountered in the character
// array, a new internal node is created with that letter as the value.
//
// When I debug through this method, the tree "appears" to be made
// as expected as the tree.value is the correct value, though I
// can't check the tree.left or tree.right values while debugging
// as the tree variable seems to get replaced each time the condition
// checks restart.
public void createTree(TreeNode tree) throws IOException {
// Check that index is not out of bounds first
if (i >= preorder.length) {
i++;
} else if (preorder[i] == '0') {
tree = new TreeNode();
tree.value = '0';
tree.left = tree.right = null;
i++;
} else {
tree = new TreeNode();
tree.value = preorder[i];
i++;
createTree(tree.left);
createTree(tree.right);
}
}
// Supposed to print out contents of the created binary trees.
// Intended only to test that the binary tree from createTree()
// method is actually being created properly.
public void preorderTraversal(TreeNode tree) {
if (tree != null) {
System.out.println(tree.value + " ");
preorderTraversal(tree.left);
preorderTraversal(tree.right);
}
}
// Reads System.in for the Strings used in making the binary tree
// and is supposed to make a different binary tree for every line of input
//
// While debugging after the createTree method runs, the resulting tree variable
// has values of tree.left = null, tree.right = null, and tree.value has no value
// (it's just a blank space).
//
// This results in preorderTraversal printing out a single square (or maybe the square
// is some character that my computer can't display) to System.out instead of all
// the tree values like it's supposed to...
public void gatherOutput() throws IOException {
InputStreamReader input = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(input);
String line = null;
TreeNode tree = new TreeNode();
while ((line = reader.readLine()) != null) {
preorder = line.toCharArray();
createTree(tree);
preorderTraversal(tree);
i = 0;
}
}
}
誰かがバイナリツリーを適切に構築するのを手伝ってくれて、私が現在得ている出力につながる間違っていることを指摘できますか?私は少なくとも正しい方向に進んでいますか?ヒントはありますか?
ありがとう。
編集:
これが「正方形」の出力の写真です(これはEclipseにあります)。