当前位置: 首页 > 知识库问答 >
问题:

如何打印用我自己的数据类型填充的二叉搜索树及其方法

任文乐
2023-03-14

我被要求编写一个应用程序“printit”,将格式为“51850 Kianna Squares,Terre Haute552.531.3674Gislason Kenna”的数据文件加载到BST中,然后遍历BST并按姓名顺序打印出电话列表。我得到了通用BST的代码,并创建了自己的记录数据类型,以当前格式存储整行。我在getName()方法中创建了一个解析行并从行中提取名称的方法。我很难找到如何让我的BST使用getName()方法,以便通过比较名称插入每个节点,并按名称的字母顺序打印出来。

然后,我被要求读取一个20个条目的查询文件,其中包含20个不同的名称。然后,我必须比较查询文件中的每个名称,并搜索具有相同名称的记录对象。record对象以原始格式“51850 Kianna Squares,Terre Haute552.531.3674Gislason Kenna”保存整行,所以我知道必须将每个名称与record对象的getName()方法进行比较,但还是遇到了麻烦。如何获取二进制搜索树以实现用于搜索和排序的getName()方法?

我的唱片类:

public class NodeInfo implements Comparable<NodeInfo>
{
String line;
String name;

public String getName(String lineTwo)
{
    String split = "\\|";
    String segments[] = lineTwo.split(split);
    String name = segments[segments.length -1];
    return name;
}
public void setName(String name)
{
    this.name = name;
}
public NodeInfo(String record)
{
    this.line = record;
}
public String getLine()
{
    return line;
}
public int compareTo(NodeInfo other)
{
    String x = this.line;
    String y = other.line;
    return x.compareTo(y);
}
public String toString()
{
    return line;
}

}

我的二叉搜索树类:

public class BinarySearchTree<NodeInfo extends Comparable<? super NodeInfo>> extends BinaryTree<NodeInfo>
{
public void insert ( NodeInfo d )
{
    if (root == null)
        root = new BinaryTreeNode<NodeInfo> (d, null, null);
    else
        insert (d, root);
}
public void insert ( NodeInfo d, BinaryTreeNode<NodeInfo> node )
{
    if (d.compareTo (node.data) <= 0)
    {
        if (node.left == null)
            node.left = new BinaryTreeNode<NodeInfo> (d, null, null);
        else
            insert (d, node.left);
    }
    else
    {
        if (node.right == null)
            node.right = new BinaryTreeNode<NodeInfo> (d, null, null);
        else
            insert (d, node.right);
    }
}

public BinaryTreeNode<NodeInfo> find ( NodeInfo d )
{
    if (root == null)
        return null;
    else
        return find (d, root);
}
public BinaryTreeNode<NodeInfo> find ( NodeInfo d, BinaryTreeNode<NodeInfo> node )
{
    if (d.compareTo (node.data) == 0)
        return node;
    else if (d.compareTo (node.data) < 0)
        return (node.left == null) ? null : find (d, node.left);
    else
        return (node.right == null) ? null : find (d, node.right);
}

我的二叉树节点类:

public class BinaryTreeNode<NodeInfo>
{
NodeInfo data;
BinaryTreeNode<NodeInfo> left;
BinaryTreeNode<NodeInfo> right;

public BinaryTreeNode ( NodeInfo d, BinaryTreeNode<NodeInfo> l, BinaryTreeNode<NodeInfo> r )
{
    data = d;
    left = l;
    right = r;
}

BinaryTreeNode<NodeInfo> getLeft ()
{
    return left;
}
BinaryTreeNode<NodeInfo> getRight ()
{
    return right;
}
}

我的二叉树类:

public class BinaryTree<NodeInfo> {
BinaryTreeNode<NodeInfo> root;

public BinaryTree() {
    root = null;
}
public void visit(BinaryTreeNode<NodeInfo> node) {
    System.out.println(node.data);
}
public void inOrder() {
    inOrder(root);
}

public void inOrder(BinaryTreeNode<NodeInfo> node) {
    if (node != null) {
        inOrder(node.getLeft());
        visit(node);
        inOrder(node.getRight());
    }
}
}

最后是我到目前为止的主要方法:

import java.io.File;
import java.util.ArrayList;
import java.util.Scanner;

public class ReadFile {

public static void main(String[] args) {

    Scanner scanOne = new Scanner(System.in);
    ArrayList<NodeInfo> holder = new ArrayList<>();

    try {

        Scanner scan = new Scanner(System.in);


        File file = new File("testdata");

        scan = new Scanner(file);

        while(scan.hasNextLine())
        {

            String line = scan.nextLine();

            NodeInfo info = new NodeInfo(line);
            holder.add(info);


        }
        scan.close();

    }
    catch (Exception ex)
    {
        ex.printStackTrace();
    }


    BinarySearchTree<NodeInfo> directory = new BinarySearchTree<>();

    for(int i = 0; i < holder.size(); i++)
    {
        NodeInfo one = holder.get(i);
        String line = one.getLine();



        directory.insert(one);

    }

    directory.inOrder();

}
}

共有1个答案

慕河
2023-03-14

您的BST调用NodeInfo的compareTo方法进行搜索和排序,该方法又使用line属性比较两个条目。使compareTo使用属性名而不是属性行进行比较。通过快速扫描,我找到了对NodeInfo实例的setName的调用。因此,您要么将其添加到扫描部分,要么依赖于compareTo方法中的getName调用,而不是使用name属性。

public class NodeInfo implements Comparable<NodeInfo>
{
...

public int compareTo(NodeInfo other)
{
  String x = getName(this.line);
  String y = getName(other.line);
  return x.compareTo(y);
}
...
}
 类似资料:
  • 下面是一个二叉查找树,它有一个根节点、一个左节点和一个右节点。代码有效,但我想显示这个二叉查找树,这样我就可以看到图层中的每个节点…这是代码…

  • 我想以这种格式打印二叉查找树: 我想我必须获得树的深度,然后,对于每个级别,在每个元素前后打印一些空格。 我不知道如何继续。 节点类:

  • //执行顺序遍历的递归方法

  • 我一直在尝试从Node切换到Java,我想知道的一件事是如何以类似于Node显示的格式打印对象,例如二叉树。例如,我的二叉树初始化代码如下: 在节点中,此二叉树将显示如下: 然而在Java,当我做system.out.println(树); 输出->BinaryTree@4554617c 什么是打印我的BinaryTree的正确方法?什么是好方法?有没有一种方法可以用JSON格式打印树?

  • 我写的是testdome https://www.testdome.com/for-developers/solve-question/9708中给出的一个测试示例的答案 问题是关于二叉搜索树的: 二叉搜索树(BST)是一种二叉树,其中每个节点的值大于或等于该节点左子树中所有节点的值,而小于该节点右子树中所有节点的值。 例如,对于以下树:n1(值:1,left:null,right:null)n2

  • 问题内容: 如何在Java中打印二进制树,使输出类似于: 我的节点: 问题答案: 我已经创建了简单的二叉树打印机。你可以根据需要使用和修改它,但是仍然没有对其进行优化。我认为很多事情可以在这里得到改善;) 输出1: 输出2: