题目0011
题目描述:
二叉树也可以用数组来存储,
给定一个数组,树的根节点的值储存在下标1,
对于储存在下标n的节点,他的左子节点和右子节点分别储存在下标2*n和2*n+1,
并且我们用-1代表一个节点为空,
给定一个数组存储的二叉树,
试求从根节点到最小的叶子节点的路径,
路径由节点的值组成。
输入描述
输入一行为数组的内容,
数组的每个元素都是正整数,元素间用空格分割,
注意第一个元素即为根节点的值,
即数组的第n元素对应下标n,
下标0在树的表示中没有使用,所以我们省略了,
输入的树最多为7层。
输出描述
输出从根节点到最小叶子节点的路径上各个节点的值,
由空格分割,
用例保证最小叶子节点只有一个。
输入
3 5 7 -1 -1 2 4
输出
3 7 2
<?php $s=fgets(STDIN); solution($s); function solution($s) { $arr = explode(' ', $s); array_unshift($arr,[0]);//在头部添加元素 $min = PHP_INT_MAX; $minPos = 0; //找最小节点 for ($i = 2; $i < count($arr); $i++) { $tmp = intval($arr[$i]); if ($tmp != 0 && $tmp != -1 && $tmp < $min && $i * 2 > count($arr)) { $min = $tmp; $minPos = $i; } } $path = []; back($arr, $minPos, $path); echo implode(' ', array_reverse($path)); } function back($arr, $minPos, &$path) { $path[] = $arr[$minPos]; if ($minPos == 1) return; if ($minPos % 2 == 0) { back($arr, $minPos / 2, $path); } else { back($arr, ($minPos - 1) / 2, $path); } }

浙公网安备 33010602011771号