我正在尝试从0和1的输入创建二叉树。例如,如果输入是11010010,则输出的树将具有1作为根。 2将是1的左孩子,4将是正确的孩子。 2将有一个正确的孩子,它将是3.这是树的结尾。当树被预先遍历时,数字1-n(n是输入中的1的数量)被分配给被访问的节点。 1意味着根有孩子。例如,第一个1意味着访问了根,并将1作为根。第二个意味着根有一个左子,一个放在那里。之后的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;
}
}
答案 0 :(得分:0)
听起来你正在以默认的,广度优先的方式构建一棵树,根据字符串的内容为每个节点分配值。
如果有帮助,首先将字符串转换为ArrayList<int>
个值以放入节点 - 例如,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);
}