PHP二叉树递归算法

jku*_*ner 5 php recursion binary-tree

我想使用二叉树和递归创建一个PHP递归程序.

我想使用递归逐级打印二叉树.我想通过树递归,将节点推入一个以关卡为参考点的hashmap.

这是我到目前为止所拥有的:

$binary_tree = array(array(1 => array(2 => array(4,5),4=>array(5,6))));

            1
            |
    ------------------
    |                |
    2                4
    |                |
----------        ----------
|        |        |        |
4        5        5        6
Run Code Online (Sandbox Code Playgroud)

最终结果应如下所示:

$data[0] = array(1);  
$data[1] = array(2,4);  
$data[2] = array(4,5,5,6);  
Run Code Online (Sandbox Code Playgroud)

我可以轻松地遍历数组并打印出与级别(数组索引)对应的数字.

这是函数,这是错误的,但我的第一次拍摄:

function recurse_tree($data,$level=0){
    $final = array();
    $tmp = array()
    // first check if data is array
    if(is_array($data)){
        // loop through data 
        foreach($data as $elm){
            // push data to the tmp array
            $tmp[] = recurse_tree($elm,$level+1);
        }
        // not an array
    } else {
            // push data to the final array. can we push to the tmp array.
            array_push($final[level],$elm);
    }
    // merge final and tmp array and return
    return ($final + $tmp);
 }
Run Code Online (Sandbox Code Playgroud)

我对递归和解决问题都没有太多经验,所以我写出了下面正在发生的步骤.我现在遇到的问题是,在第9步,我不确定如何处理键2和4,然后最终处理根节点,键1.此外,当我进入步骤5-8时,我在第4级,这是正确的,但根据树,它的2级.

$flattened_tree = recurse_tree($data);

// STEPS:  
1./ called recurse_tree  
    data: array(array(1 => array(2 => array(4,5),4=>array(5,6))));  
    level: 0  
    final:  array();  
    tmp:  array();  
2./ called recurse_tree:  
    data: array(1 => array(2 => array(4,5),4=>array(5,6)));  
    level: 1  
    final: array();  
    tmp: array();  
3./ called recurse_tree:  
    data: array(2 => array(4,5),4=>array(5,6));  
    level: 2
    final: array();  
    tmp: array();
4./ called recurse_tree:
    data: array(4,5)
    level: 3
    final: array();  
    tmp: array();
5./ called recurse_tree:
    data: 4
    level: 4
    final: array(4 => 4)
    tmp: array()
6./ called recurse_tree:
    data: 5
    level: 4
    final: array(4 => 5)
    tmp: array(4 => 4)
7./ called recurse_tree:
    data: 5
    level: 4
    final: array(4=> 5)
    tmp: array(4 => array(4,5))
8./ called recurse_tree:
    data: 6
    level: 4
    final: array(4 => 6)
    tmp: array(4 => array(4,5,5))         
Run Code Online (Sandbox Code Playgroud)

实现二叉树递归算法的最佳方法是什么?

net*_*der 10

如果我理解正确,这就是你想要的:

function tree(array $data, &$tree = array(), $level = 0) {
    // init
    if (!isset($tree[$level])) $tree[$level] = array();

    foreach ($data as $key => $value) {
        // if value is an array, push the key and recurse through the array
        if (is_array($value)) {
            $tree[$level][] = $key;
            tree($value, $tree, $level+1);
        }

        // otherwise, push the value
        else {
            $tree[$level][] = $value;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

$binary_tree = array(1 => array(2 => array(4,5),4=>array(5,6)));
tree($binary_tree, $output);
var_dump($output);
Run Code Online (Sandbox Code Playgroud)

这给你:

array(3) {
  [0]=>
  array(1) {
    [0]=>
    int(1)
  }
  [1]=>
  array(2) {
    [0]=>
    int(2)
    [1]=>
    int(4)
  }
  [2]=>
  array(4) {
    [0]=>
    int(4)
    [1]=>
    int(5)
    [2]=>
    int(5)
    [3]=>
    int(6)
  }
}
Run Code Online (Sandbox Code Playgroud)