用数组构建一个二叉树
采用顺序存储的方式,如下图所示
如果父节点的数组下标是i
,那么它的左孩子下标是i * 2 + 1
,右孩子下标就是i * 2 + 2
。因此在java中可以使用下面的代码通过数组构建一个二叉树
static class TreeNode {
int val;
TreeNode left;
TreeNode right;
public TreeNode(int x) {
this.val = x;
this.left = null;
this.right = null;
}
}
private static TreeNode constructBinaryTree(final int[] arr) {
//构建和原数组相同的树节点列表
List<TreeNode> treeNodeList = arr.length > 0 ? new ArrayList<>(arr.length) : null;
TreeNode root = null;
//把输入数值数组,先转化为二叉树节点列表
for (int i = 0; i < arr.length; i++) {
TreeNode node = null;
if (arr[i] != -1) {
//用-1表示null
node = new TreeNode(arr[i]);
}
treeNodeList.add(node);
if (i == 0) {
root = node;
}
}
//遍历一遍,根据规则左右孩子赋值即可,注意这里结束规则是
//i * 2 + 2 < arr.length 避免空指针
for (int i = 0; i * 2 + 2 < arr.length; i++) {
TreeNode node = treeNodeList.get(i);
if (node != null) {
node.left = treeNodeList.get(2 * i + 1);
node.right = treeNodeList.get(2 * i + 2);
}
}
return root;
}