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;
}