Php 以完整的二叉树、数组格式获取级别上的所有节点

Php 以完整的二叉树、数组格式获取级别上的所有节点,php,arrays,binary-tree,Php,Arrays,Binary Tree,我需要从左子树或右子树中获取完整二叉树中某一级别的所有节点。我当前从数据库中以数组形式检索二叉树,例如: [1,2,3,4,5,6,7]表示如下树: 1 / \ / \ 2 3

我需要从左子树或右子树中获取完整二叉树中某一级别的所有节点。我当前从数据库中以数组形式检索二叉树,例如:
[1,2,3,4,5,6,7]
表示如下树:

                                     1
                                    / \
                                   /   \
                                  2     3
                                 / \   / \
                                /   \ /   \
                               4    5 6    7
所以我需要做的基本上是获取树的一个级别,并将其作为数组返回。类似于
级别(3,“左”)->[4,5]
级别(2,“右”)->[3]
。我在考虑创建一个二进制树对象,递归地执行它,但是我想不出一种方法来跟踪调用中的级别,而不必用级别或类似的东西标记每个节点,因为我希望尽可能保持数据库的干净。有什么想法吗

编辑:我真的需要左或右子树的所有节点,而不是整个树。我正在展示一场比赛,所以我需要把它分成两半。如果我不必拆分它,我可能会这样做:

function level($array, $level_num) {
    return array_slice($array, pow(2, $level_num)-1, pow(2, $level_num));
}
我真的不知道如何扩展它,以便只获取左或右子树的级别数组。

//根据需要调整深度
// Adjust depth as needed
$depth = 3;

// using bit arithmetic. '<< 3' means multiply by 2 three times.
$start = 1 << $depth-1; // 1 * (2 * 2) because depth is 3
$end = (1 << $depth) -1; // 1 * (2 * 2 * 2) - 1

// if depth=3, this is [4,5,6,7]
$fullLevel = range($start, $end);

print_r($fullLevel);

if($depth > 1):
    $leftBranch = array_slice($fullLevel,0,count($fullLevel)/2);
    $rightBranch = array_slice($fullLevel,count($fullLevel) / 2);

    print_r($leftBranch); // [4,5]
    print_r($rightBranch); // [6, 7]
endif;
$depth=3; //使用位运算。”<代码>//根据需要调整深度 $depth=3;
//使用位运算。” 我投票支持甲壳虫汁的答案使用“左移”位运算符
我投票支持甲壳虫汁的答案使用“左移”位运算符
,这是一个非常酷的问题。试试看,看看你失败的代码。还要注意,渲染的图像与示例数组不匹配。这个数组有一个4和一个8。图像没有4,但是有8。对不起,没有注意到。刚刚更新。好的,我写了一个解决方案。在您的OP中,
级别(3)
仍然包含
8
,即使它不在树中。@mickmackusa是的,我的错,这是另一个打字错误。这是一个非常酷的问题。试试看,看看你失败的代码。还要注意,渲染的图像与示例数组不匹配。这个数组有一个4和一个8。图像没有4,但是有8。对不起,没有注意到。刚刚更新。好的,我写了一个解决方案。在你的OP中,
级别(3)
仍然包含
8
,即使它不在树中。@mickmackusa是的,我的错,它是另一个打字错误。我也意识到,得到左边或右边的部分只是将它一分为二。使用
@ashraj98
pow()
的任何优势都会从您身上消失。。。这是一个例子。我也意识到,得到左边或右边的部分就是把它一分为二。使用
@ashraj98
pow()
的任何优势都会从您身上消失。。。这是一个例子,我没有引用任何索引。这个功能(比如甲壳虫汁)不需要“长满树”。它确定树的指定“级别”中的整数,并返回指定分支中的值数组。构建一个完整的树(多维数组)只提取其中的一小部分——效率低下/浪费。最好的做法是只构建你需要的东西。是的,我看了一会儿才意识到这一点。假设树节点不是
[1,2,3,4,5,…]
?我只是以OP中的树为例。在实际使用中,节点值是Laravel中模型的ID,因此它永远不会像示例一样。@ashraj98我没有引用任何索引。这个功能(比如甲壳虫汁)不需要“长满树”。它确定树的指定“级别”中的整数,并返回指定分支中的值数组。构建一个完整的树(多维数组)只提取其中的一小部分——效率低下/浪费。最好的做法是只构建你需要的东西。是的,我看了一会儿才意识到这一点。假设树节点不是
[1,2,3,4,5,…]
?我只是以OP中的树为例。在实际使用中,节点值是Laravel中模型的ID,因此它永远不会像示例中那样。
function getForkinValues($array,$level,$side='left'){ // left side fork is default
    if($level==1) return current($array);
    $length=$level>2?1<<($level-2):1;  // number of elements to return
    $index=(1<<$level-1)-1;            // first index to return
    if($side=='right') $index+=$length;  // shift to correct index for 'right'
    if(!isset($array[$index+$length-1])) return 'Error: Insufficient Array Length';
    return array_slice($array,$index,$length);

}
$array=['A','B','C','D','E','F','G'];
var_export(getForkinValues($array,3,'right'));