2017-07-13 13 views
1

これはバイナリツリーを作成して要素を挿入するために書いたJavaプログラムです。しかし、要素を再帰的に挿入するためのプログラムを書くことができず、したがってそれぞれ手動で左と右の子を指定しなければなりませんでした。バイナリツリーに再帰的に挿入する方法と再帰的に要素を印刷する方法はありますか?

public class BinTree { 

private Node root; 

private class Node { 
Node left; 
Node right; 
int data; 

private Node(int data) { 
    this.data = data; 
    left = null; 
    right = null; 
} 
} 
public BinTree() { 
root = null; 
} 
public void preorder(Node temp) { 
temp = root; 
if(temp != null) { 
    System.out.print(temp.data + " "); 
    preorder(temp.left); 
    preorder(temp.right); 
} 
} 
public void add() { 

root = new Node(10); 
root.left = new Node(20); 
root.right = new Node(30); 
root.left.left = new Node(40); 
root.left.right = new Node(50); 
root.right.left = new Node(60); 
} 
public static void main(String[] args) { 

BinTree bt = new BinTree(); 
bt.add(); 
System.out.print(bt.root.data); 
System.out.print(" " + bt.root.left.data); 
System.out.print(" " + bt.root.right.data); 
System.out.print(" " + bt.root.left.left.data); 
System.out.print(" " + bt.root.left.right.data); 
} 
} 

また、私は上記のプログラムのために書いた先行順走査が失敗したと私はいくつかの果てしない出力を得た:

は、ここに私のコードです。実行を殺さなければならなかった!

したがって、バイナリツリーに要素を挿入する正しい実装を再帰的に提供できるものがあれば、大きな助けになるでしょう。

また、可能であれば、私の予約注文トラバーサルでどこでミスをしたか教えてください。

ありがとうございます!

+0

ノードを再帰的に挿入する方法は不明です。その目的のための関数は、挿入の位置を見つける方法の基準を持つ必要があります。 – Codor

+0

はい、それは私が立ち往生したところです!私は前の挿入の後に挿入の次のポイントの位置を見つけることができません! – doctorwho

答えて

2

一部の質問に答えるために、preorder関数はツリーを実際には通り抜けませんが、ルートから何度も繰り返し始めるのでバグがあります。

public void preorder(Node temp) 
{ 
    if(temp != null) 
    { 
     System.out.print(temp.data + " "); 
     preorder(temp.left); 
     preorder(temp.right); 
    } 
} 

に変更し、ツリーのルートを引数として呼び出します。

+0

おかげで多くの仲間! :)それは働いて....とあなたのソリューションに感謝私もそれに応じて(同様のロジック)find()関数を実装している。しかし、私はまだ再帰的な挿入に固執しています。どんな助け? – doctorwho

関連する問題