Java 二叉树创建

Java 二叉树创建,java,binary-tree,Java,Binary Tree,我正在尝试从0和1的输入创建一个二叉树。例如,如果输入是11010010,那么输出的树将有1作为根。2是1的左孩子,4是右孩子。2会有一个合适的孩子,那就是3。那是树的尽头。当按预先顺序遍历树时,数字1-n(n是输入中1的数量)被分配给所访问的节点。A 1表示根有子级。例如,第一个1表示访问根目录,并将1作为根目录放置。第二个1表示根有一个左子级,并在那里放置一个2。之后的0表示它没有左子级。下一个1表示它确实有一个正确的子级,3放在那里,等等。我不知道这棵树是如何创建的。我理解在树被创建后遍历

我正在尝试从0和1的输入创建一个二叉树。例如,如果输入是11010010,那么输出的树将有1作为根。2是1的左孩子,4是右孩子。2会有一个合适的孩子,那就是3。那是树的尽头。当按预先顺序遍历树时,数字1-n(n是输入中1的数量)被分配给所访问的节点。A 1表示根有子级。例如,第一个1表示访问根目录,并将1作为根目录放置。第二个1表示根有一个左子级,并在那里放置一个2。之后的0表示它没有左子级。下一个1表示它确实有一个正确的子级,3放在那里,等等。我不知道这棵树是如何创建的。我理解在树被创建后遍历它,但不理解如何通过遍历它来创建树。任何帮助都将不胜感激

package tree;

import java.io.*;

public class BinaryTree<ArrayList> implements Serializable
{   
private static final long serialVersionUID = 1L;

protected static class Node<ArrayList> implements Serializable
{
    private static final long serialVersionUID = 1L;

    protected int data;
    protected Node<ArrayList> left;
    protected Node<ArrayList> right;

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

    public boolean isLeft() 
    {
        return (left == null);
    }
}

protected Node<ArrayList> root;;

public BinaryTree(int x)
{
    Node<ArrayList> node = new Node<ArrayList>(x);
    this.root = node;
}

public boolean isLeft()
{
    return(root.left == null);
}

public void addLeft(int m, BinaryTree.Node<ArrayList> node)
{
    root = new Node<ArrayList>(m);
    node.left = root;
}   

 public void preorder(Node<ArrayList> temp)  
 {  
      if (temp!=null)  
      {  
           System.out.println(temp.data);  
           preorder(temp.left);  
           preorder(temp.right);  
      }  
      else  
           return;  
 } 
包树;
导入java.io.*;
公共类二进制树实现了可序列化
{   
私有静态最终长serialVersionUID=1L;
受保护的静态类节点实现可序列化
{
私有静态最终长serialVersionUID=1L;
受保护的int数据;
左保护节点;
受保护的节点权限;
公共节点(int数据)
{
这个数据=数据;
左=空;
右=空;
}
公共布尔值isLeft()
{
返回(左==null);
}
}
受保护的节点根;;
公共二叉树(intx)
{
节点=新节点(x);
this.root=节点;
}
公共布尔值isLeft()
{
返回(root.left==null);
}
public void addLeft(int m,BinaryTree.Node)
{
根=新节点(m);
node.left=根;
}   
公共无效预订单(节点临时)
{  
如果(温度!=null)
{  
系统输出打印LN(温度数据);
预订单(左侧温度);
预订单(右侧温度);
}  
其他的
返回;
} 

}

听起来像是在以默认的广度优先方式构建一棵树,根据字符串的内容为每个节点分配值

如果有帮助,首先将字符串转换为要放入节点的值的
ArrayList
——例如,
11010010
将变成
{1,2,4,7}
,字符串中每个集合1的索引

现在,我们必须构建这棵树——但我们总是以完全相同的方式构建这棵树,称为宽度优先,因为在深入之前,你会完全填充浅层。我们做一个节点,然后告诉它‘做你的左节点,然后做你的右节点,然后告诉你的左节点做这个,然后告诉你的右节点做这个’。(这与深度优先相反,在深度优先中,创建左节点,让左节点创建节点,然后创建右节点,让右节点创建节点)

因此,您将有一个递归方法,类似于以下伪代码:

void continueTree(ArrayList<int> numbers)
{
    if (numbers.count() == 0) return;
    this.left = new Node(numbers.get(0));
    numbers.remove(0);
    if (numbers.count() == 0) return;
    this.right = new Node(numbers.get(0));
    numbers.remove(0);
    this.left.continueTree(numbers);
    this.right.continueTree(numbers);
}
void continueTree(数组列表编号)
{
如果(numbers.count()==0)返回;
this.left=新节点(numbers.get(0));
数字。删除(0);
如果(numbers.count()==0)返回;
this.right=新节点(numbers.get(0));
数字。删除(0);
this.left.continueTree(数字);
这个.right.continueTree(数字);
}

您能将其格式化为更可读的格式吗。@Jayamohan对不起,我不知道您的意思。格式化问题?你的问题是什么?你也试过什么吗?我建议您至少提供一点代码来帮助说明您的问题。@code Guru我添加了代码,实际上我的问题是如何按预排序创建二叉树。