2016-10-24 12 views
1

Javaでバイナリツリーを実装するのに助けが必要です。Javaでバイナリツリーを入力する方法

私はテキストファイルからそれを読むのと同じではありません。ユーザーがスキャナを使用してツリーを入力した後、ツリー値を作成して出力することを意味します。また、「 - 」記号はツリー内のヌル値を意味します。

これまでのところ、ノードクラスが動作していますが、私はそれが前記ノードからツリーを作ることができるようにする必要があります。また、入力の受け入れを停止する時期も知っておく必要があります。

ここに私のコードがあります。私はノードのリストを入力し、これらのクラスを使ってツリーにする方法が必要です。例えば、同様

import java.util.Scanner; 
import java.io.*; 
import java.util.*; 
import java.text.*; 
import java.math.*; 
import java.util.regex.*; 
import java.util.Queue; 
import java.util.LinkedList; 


/** 
* 
* @author phirstprince 
*/ 

class TreeNode { 
    int data; 
    TreeNode LC, RC; 

    public TreeNode(int x) { 
     data = x; 
     LC = null; 
     RC = null; 
    } 

} 

    public class TreeDeserialize { 

     /** 
     * @param args the command line arguments 
     */ 
     public static void main(String[] args) { 
      Scanner input = new Scanner(System.in); 
      int x = input.nextInt(); 
     } 

    } 

、人が入力した場合、この - それは、このようなツリーにそれを整理することになる

1 
2 
3 
- 
4 
5 
6 
- 
- 
- 
- 
- 
- 

(あるヌルノード)。

  1 
    / \ 
     2  3 
     \ /\ 
     4 5 6 

誰でも役に立つと思いますか?キューが必要だと思う。また、入力の受け入れをいつ止めるかを知る方法を教えてください。

+0

あなたは、ヒープ構造を実装しようとしていますか?表示しているツリーがバイナリ検索ツリー(2,4,5が間違った場所にあります)と一致しませんが、ヒープに一致します。 – 4castle

答えて

1

数値をチェックして、たとえば親よりも大きい数字を右に追加するメソッドを開発する必要があります。親より小さい場合は左に追加する必要があります。あなたは再帰の助けを借りてこの機能を開発できると思います。

+0

このリンクをチェックすると便利ですhttps://www.cs.cmu.edu/~adamchik/15-121/lectures/Trees/trees.html –

+0

OPによって提案された構造は以下のルールに従いません右側が大きく、左側が小さくなっています。それはヒープのように私に見えますが、それはちょうど挿入命令に基づいているかもしれません。 – 4castle

+0

彼らは順番に追加されているわけではありません。それらは「先が先」の方法で追加されたようなものです。それは一度に1つのレベルをツリーに追加するのと同じです。 – Hexi

0

新しいノードをレベルごとに左から右に挿入しようとする関数です。基本的には、ノードを挿入できる場所が見つかるまで幅優先探索を行います。

public static void insert(TreeNode root, int x) { 
    Queue<TreeNode> q = new LinkedList<TreeNode>(); 
    q.offer(root); 

    while(!q.isEmpty()) { 
     TreeNode u = q.poll(); 

     if(u.LC == null) { 
      u.LC = new TreeNode(x); 
      break; 
     } 

     if(u.RC == null) { 
      u.RC = new TreeNode(x); 
      break; 
     } 

     if(!u.LC.isNull) 
      q.offer(u.LC); 

     if(!u.RC.isNull) 
      q.offer(u.RC); 
    } 
} 

この機能を有効にするには、ユーザーが「 - 」を入力するたびに特別な「ヌル」ノードを挿入する必要があります。あなたはこのためにあなたのTreeNodeクラスのブールフラグを使用することができます。

class TreeNode { 
    int data; 
    boolean isNull; 
    TreeNode LC, RC; 

    public TreeNode(int x) { 
     data = x; 
     LC = null; 
     RC = null; 
    } 

    public TreeNode() { 
     isNull = true; 
    } 
} 

最後に、あなたがユーザーによって要求されたときにヌルノードを挿入するInsertメソッドをオーバーロードすることができます。オーバーロードされた関数は、それがデフォルトコンストラクタを使用して新しいのTreeNodeを作成することを除いて同じである:

public static void insert(TreeNode root) { 
    Queue<TreeNode> q = new LinkedList<TreeNode>(); 
    q.offer(root); 

    while(!q.isEmpty()) { 
     TreeNode u = q.poll(); 

     if(u.LC == null) { 
      u.LC = new TreeNode(); 
      break; 
     } 

     if(u.RC == null) { 
      u.RC = new TreeNode(); 
      break; 
     } 

     if(!u.LC.isNull) 
      q.offer(u.LC); 

     if(!u.RC.isNull) 
      q.offer(u.RC); 
    } 
} 

あなたの主な方法は次のようになります。

public static void main(String[] args) { 
    Scanner input = new Scanner(System.in); 
    int x = input.nextInt(); 
    TreeNode root = new TreeNode(x); 

    while(true) { 
     String str = input.next(); 
     if(str.equals("-")) 
      insert(root); 
     else 
      insert(root, Integer.parseInt(str)); 
    }  
} 
+0

奇妙な。それでは、私はまだ入力を許可していません - 今すぐ。 – Hexi

+0

私は入力を固定したと思います。しかし、今では入力を追加するのをやめさせていません。いつ停止するかを知るためにはどうすればよいですか? – Hexi

+0

心配しないで、私は自分で働いています。 – Hexi

関連する問題