2017-12-27 27 views
1

SortTreeクラスからTreePrinterに(node.data)を送信してAツリーを印刷する方法を教えてください。印刷方法バイナリツリー?

import javax.swing.tree.TreeNode; 


public class SortTree { 

static Node root; 
TreePrinter type =new TreePrinter(); 

class Node<A extends Comparable>{ 

int data; 
Node left, right; 

Node(int d) { 
    data = d; 
    left = null; 
right = null; 
} 
} 

Node sortedArrayToBST(int arr[], int start, int end) { 
if (start > end) { 
    return null; 
} 

int mid = (start + end)/2; 
Node node = new Node(arr[mid]); 
node.left = sortedArrayToBST(arr, start, mid - 1); 
node.right = sortedArrayToBST(arr, mid + 1, end);  
return node; 
} 
void preOrder(Node node) { 
if (node == null) { 
    return; 
} 
//System.out.print(node.data + " "); 
preOrder(node.left); 
preOrder(node.right); 
} 
} 

そして、これがTreePrinterクラスです:

import java.io.IOException; 
import java.io.OutputStreamWriter; 

public class TreePrinter { 

public static class Node<T extends Comparable<T>> { 
T value; 
Node<T> left, right; 

public void insertToTree(T v) { 
if (value == null) { 
    value = v; 
    return; 
} 
if (v.compareTo(value) < 0) { 
    if (left == null) { 
     left = new Node<T>(); 
    } 
    left.insertToTree(v); 
} else { 
    if (right == null) { 
     right = new Node<T>(); 
    } 
    right.insertToTree(v); 
} 
} 

public void printTree(OutputStreamWriter out) throws IOException { 
if (right != null) { 
    right.printTree(out, true, ""); 
} 
printNodeValue(out); 
if (left != null) { 
    left.printTree(out, false, ""); 
} 
} 

private void printNodeValue(OutputStreamWriter out) throws IOException { 
if (value == null) { 
    out.write("<null>"); 
} else { 
    out.write(value.toString()); 
} 
out.write('\n'); 
} 

private void printTree(OutputStreamWriter out, boolean isRight, String indent) throws IOException { 
if (right != null) { 
    right.printTree(out, true, indent + (isRight ? "  " : " |  ")); 
} 
out.write(indent); 
if (isRight) { 
    out.write("┌"); 
} else { 
    out.write("└"); 
} 
out.write("────"); 
printNodeValue(out); 
if (left != null) { 
    left.printTree(out, false, indent + (isRight ? " |  " : "  ")); 
} 
}}} 

行きがけとしてツリーを入力し(node.data)treeprinterにクラスを送信するために任意のヘルプをソートノード:

答えて

0

私はあなたがのtoStringを実装するお勧めではなく、このTreePrinter。

Nodeクラスを少し変更してSortTreeの外に移動しました。コードはhttps://github.com/johanwitters/stackoverflow-tree-printerから利用可能です。

ノードの実装はここにある:

package com.johanw.stackoverflow.tree; 

import com.johanw.stackoverflow.util.Helper; 

public class Node<A extends Comparable>{ 
    private static int AMOUNT_INDENT = 3; 

    private int data; 
    private Node left, right; 

    public Node(int d) { 
     data = d; 
     left = null; 
     right = null; 
    } 

    public void setLeft(Node left) { 
     this.left = left; 
    } 

    public void setRight(Node right) { 
     this.right = right; 
    } 

    public int getData() { 
     return data; 
    } 

    public Node getLeft() { 
     return left; 
    } 

    public Node getRight() { 
     return right; 
    } 

    public void indent(StringBuilder builder, int indent) { 
     builder.append(Helper.repeat(indent * (AMOUNT_INDENT + 1), " ")); 
    } 

    public void newLine(StringBuilder builder) { 
     builder.append(System.lineSeparator()); 
    } 

    public String toString(int indent) { 
     StringBuilder builder = new StringBuilder(); 
     builder.append(data); 
     newLine(builder); 
     if (left != null) { 
      indent(builder, indent); 
      builder.append("└" + Helper.repeat(AMOUNT_INDENT, "─") + left.toString(indent + 1)); 
     } 
     if (right != null) { 
      indent(builder, indent); 
      builder.append("└" + Helper.repeat(AMOUNT_INDENT, "─") + right.toString(indent + 1)); 
     } 
     return builder.toString(); 
    } 

    @Override 
    public String toString() { 
     return toString(0); 
    } 
} 

下のユニットテストは、与えられたツリー構造のために下の出力が得られます。

public class TestSortTree { 
    @Test 
    public void test() { 
     Node node = new Node(1); 
     Node left = new Node(2); 
     Node leftLeft = new Node(22); 
     Node leftRight = new Node(23); 
     Node leftRightLeft = new Node(24); 
     left.setLeft(leftLeft); 
     leftRight.setLeft(new Node(39)); 
     left.setRight(leftRight); 
     node.setLeft(left); 
     node.setRight(new Node(3)); 
     System.out.println(node.toString()); 
    } 
} 

enter image description here

私は、これは

を役に立てば幸い
0

nodを受信できるようにするにはe.data in TreePrinter。私はNode sortedArrayToBST(int arr[], int start, int end)に次の変更を行うことで、データを送信します

How to print binary tree diagram?

:私はそれが今、このポストからのアルゴリズムを使用してツリーを印刷しやすいだろう次のコード

class TreePrinter<T extends Comparable<T>>{ 
    Node<T extends Comparable<T>> root; 

    public TreePrinter(){ 
     root = new Node<T extends Comparable<T>>(); 
    } 

    public void insertToTree(T v) { 
     root.insertToTree(v); 
    } 

を追加しますSortTree

void sortedArrayToBST(int arr[], int start, int end) { 
    if (start > end) { 
     return; 
    } 

    int mid = (start + end)/2; 
    type.insertToTree(arr[mid]); 
    node.left = sortedArrayToBST(arr, start, mid - 1); 
    node.right = sortedArrayToBST(arr, mid + 1, end); 
} 

私は、これはので、いくつかのデバッグを実行する必要がある場合がありますしようとしたが、していません根底にあるアイデアは確かだと思います。お役に立てれば!

関連する問題