题目
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
题解
递归遍历二叉树
代码
/*递归版本*/
/*class TreeNode{
var $val;
var $left = NULL;
var $right = NULL;
function __construct($val){
$this->val = $val;
}
}*/
function FindPath($root, $expectNumber)
{
if($expectNumber == 0 || $root == null || $root->val > $expectNumber) {
return array();
}
$stack = array();
$path = array();
cal($stack, $path, $root, $expectNumber);
return $path;
}
function cal(&$stack, &$path, $root, $expectNumber) {
array_push($stack, $root->val);
if($root->val == $expectNumber && $root->left == null && $root->right == null) {
array_push($path, $stack);
}
else {
if($root->left != null){
cal($stack, $path, $root->left, $expectNumber - $root->val);
}
if($root->right != null) {
cal($stack, $path, $root->right, $expectNumber - $root->val);
}
}
array_pop($stack);
}
非递归也可以实现:(不是我写的,思路大同小异)
function FindPath($root, $expectNumber)
{
if($root==null){
return [];
}
$stack = array($root);
$result = array();
while(count($stack)!=0){
$topnode = end($stack);
while ($topnode->left != null || $topnode->right!= null){
if($topnode->left != null){
$stack[] = $topnode->left;
$p = $topnode->left;
$topnode->left = null;
$topnode = $p;
}elseif ($topnode->right != null){
$stack[] = $topnode->right;
$p = $topnode->right;
$topnode->right = null;
$topnode = $p;
}
}
$sum = 0;
$sub_paths = array();
foreach ($stack as $node){
$sum += $node->val;
$sub_paths[] = $node->val;
if($sum>$expectNumber){
break;
}
}
if($sum==$expectNumber){
$result[] = $sub_paths;
}
while($topnode->left == null && $topnode->right== null){
array_pop($stack);
if(count($stack)==0){
return $result;
}
$topnode = end($stack);
}
}
return result;
}