Inorderトラバーサルの結果をLinkedListに格納し、イテレータで取得しようとしましたが、結果を出力中にnullポインタ例外が発生しました。再帰でそれを行い、関数の値を出力しようとすると正しい出力が得られます。再帰的にinorderItr(root.left)
に電話をかけようとすると、root
がnullになります。私は、私のreturn文は正しいとは思わない、確かに、以下は私のコードと私のコードが壊れているコメントです。どんなヘルプやコンセプトも高く評価されています。 Iterator
を返そうとしているので、私はthisを見ましたが、助けになりません。再び、私はJavaと新しい概念をIterator
コンセプトです。 TIA。バイナリツリーでInorderトラバーサルのIteratorを返す方法は?
編集:私は解決策を見つけた、私はINORDERトラバーサルとグローバルLinkedListのためのヘルパーメソッドを作成し、別の再帰的ヘルパーで、そのリストにすべての私の順序どおり要素を追加した
class TreeNode {
int data;
TreeNode left;
TreeNode right;
public TreeNode(int d) {
data = d;
}
}
public class TreeTraversal {
TreeNode root;
public TreeTraversal() {
root = null;
}
static List<TreeNode> l = new LinkedList<TreeNode>();
public static Iterator<TreeNode> inorderItr(TreeNode root) {
List<TreeNode> l = new LinkedList<TreeNode>();
//I think I am missing something here
if (root == null)
return
//This is where my root is null
inorderItr(root.left);
l.add(root);
inorderItr(root.right);
Iterator<TreeNode> itr = l.iterator();
return itr;
}
//This code works fine
public static void inorderWorksFine(TreeNode root) {
if (root == null)
return;
inorder(root.left);
System.out.print(root.data + " ");
inorder(root.right);
}
public static void main(String args[]) {
TreeTraversal t = new TreeTraversal();
t.root = new TreeNode(10);
t.root.left = new TreeNode(5);
t.root.left.left = new TreeNode(1);
t.root.left.right = new TreeNode(7);
t.root.right = new TreeNode(40);
t.root.right.right = new TreeNode(50);
// inorderWorksFine(t.root);
Iterator<TreeNode> itr = inorderItr(t.root);
while (itr.hasNext()) {
System.out.println(itr.next().data + " ");
}
}
}
可能な複製(https://stackoverflow.com/questions/12850889/in-order-iterator-for-binary-tree) – vinS
@vinS:私は 'Iterator'を返そうとしています。私はその解決策を見てきました。上記のコードを変更して、何が間違っているのか教えてもらえますか? – Techiee
このようなイテレータインターフェイスを実装するクラスを作成することをお勧めします。あなたは新しい反復ステップを作成するために各再帰的ステップでイテレータを反復することによって恐ろしいパフォーマンスに頼ることなく、データ反復子を返す再帰的メソッドを作成するのは本当に苦労します。また、イテレータを作成するために別の構造体(LinkedList)に変換すると、初期費用が高価な場合はツリーを作成する目的が幾分かぎります。 – Zachary