Java 从值序列构造二叉树

Java 从值序列构造二叉树,java,insert,binary-tree,Java,Insert,Binary Tree,如何从一系列值构造二叉树 Input: [4,9,0,5,1] 4 / \ 9 0 / \ 5 1 Input with null: [1,2,3,null,5,6,7] 1 / \ 2 3 / \ / \ null 5 6 7 注意:该树不是二进制搜索树。 节点按预先顺序(根、左、右)插入。 首先从左到右填充子节点。填充该级别后,转到下一个级别。 我的直觉是保留父节点的引用 public cl

如何从一系列值构造二叉树

Input: [4,9,0,5,1]
    4
   / \
  9   0
 / \
5   1

Input with null: [1,2,3,null,5,6,7]

       1
     /   \
    2     3
  /  \   /  \
null  5  6   7


注意:该树不是二进制搜索树。 节点按预先顺序(根、左、右)插入。 首先从左到右填充子节点。填充该级别后,转到下一个级别。 我的直觉是保留父节点的引用

public class TreeNode {
    public int value;
    public TreeNode left;
    public TreeNode right;

    public TreeNode(int x) {
        value = x;
    }
}

public static TreeNode createTree(List<Integer> values) {
   // ???
   // return the root node
}
公共类树节点{
公共价值观;
公共树节点左;
公共树节点权;
公共树节点(int x){
值=x;
}
}
公共静态树节点createTree(列表值){
// ???
//返回根节点
}
问这个我觉得很愚蠢

PS:我想知道这棵树是如何从输入构建的


PS2:Berto99给出了递归方法的草案。想知道迭代方式(需要保留父节点的引用)

从堆中汲取灵感:

public static TreeNode createTree(List<Integer> values, int index) {
   TreeNode tree = new TreeNode(values[index]);
   if(index * 2 < list.size())
       tree.left = createTree(values, index * 2);
   if(index * 2 + 1 < list.size())
       tree.right = createTree(values, index * 2 + 1);
   return tree;
}

逻辑非常简单,给定一个数组,
根是第一个元素,左边的子元素是
pos*2
,右边的子元素是
pos*2+1
(同样,first=1,不是0)

@Berto99给出了主要思想

用输入[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]可视化树

             0
        /          \
      1             2
    /   \         /    \
  3       4      5       6 
 / \    /  \    /  \    /  \
7   8  9   10  11  12  13  14

Substitute the value 3 by index then you can infer the recurrence for left and right node.
node(3).left = 7 = 2 * index + 1
node(3).right = 8 = 2 * index + 2
完整的微调代码如下所示

    public static TreeNode createTree(List<Integer> values) {
        if (values == null || values.size() == 0) return null;
        TreeNode root = createTree(values, 0);
        return root;
    }

    private static TreeNode createTree(List<Integer> values, int index) {
        if (index >= values.size()) return null;

        Integer value = values.get(index);
        if (value == null) return null;

        TreeNode tree = new TreeNode(value);

        // tree(index).left = 2 * index + 1
        tree.left = createTree(values, index * 2 + 1);

        // tree(index).right = 2 * index + 2
        tree.right = createTree(values, index * 2 + 2);

        return tree;
    }
publicstatictreenodecreatetree(列表值){
if(values==null | | values.size()==0)返回null;
TreeNode root=createTree(值为0);
返回根;
}
私有静态树节点createTree(列表值,int索引){
if(index>=values.size())返回null;
整数值=value.get(索引);
if(value==null)返回null;
TreeNode树=新的TreeNode(值);
//树(索引)。左=2*索引+1
tree.left=createTree(值,索引*2+1);
//树(索引)。右=2*索引+2
tree.right=createTree(值,索引*2+2);
回归树;
}

希望代码能够工作,我已经有一段时间没有编写Java代码了。我知道了,索引是通过递归迭代的(不是在循环中)。然后,初始化
treenoderoot=createTree(值1)
@RaymondChenon确切地说,您如何将
null
值存储到
int-value
    public static TreeNode createTree(List<Integer> values) {
        if (values == null || values.size() == 0) return null;
        TreeNode root = createTree(values, 0);
        return root;
    }

    private static TreeNode createTree(List<Integer> values, int index) {
        if (index >= values.size()) return null;

        Integer value = values.get(index);
        if (value == null) return null;

        TreeNode tree = new TreeNode(value);

        // tree(index).left = 2 * index + 1
        tree.left = createTree(values, index * 2 + 1);

        // tree(index).right = 2 * index + 2
        tree.right = createTree(values, index * 2 + 2);

        return tree;
    }