二叉树中和为某一值的路径
二叉树中和为某一值的路径
http://www.nowcoder.com/questionTerminal/b736e784e3e34731af99065031301bca
思路——动态规划(应该算吧?)
要点
- 辅助函数
- 假设知道前面节点的路径数组pre
- 用一个二维数组resArr保存所有路径
判断逻辑
情况1、如果当前节点 == null,或其值 > 期待值
那么就不用继续遍历下去了,return。
情况2、如果当前节点的值 == 期待的值,并且当前节点是叶子节点
那么就找到了一个路径,将当前节点的值加入pre(之前的路径数组),再将pre加入我们的结果resArr中。
情况3、以上情况都不满足
说明还可以继续找下去。就更新参数,对其左右子节点递归。
代码
function FindPath(root, expectNumber)
{
// write code here
// 保存路径结果
var resArr = [];
// 前序遍历,递归查找
nextLayer(root, expectNumber, [], resArr);
// 让数组长度大的靠前。(不做处理好像也通过测试了,不过还是按题意来得好)
resArr.sort(function(a, b){
return b.length - a.length;
});
return resArr;
}
function nextLayer(node, exp, pre, resArr){
// 情况1
if(node==null || node.val > exp){
return;
}
// 注意对过期路径做拷贝,因为左右子节点都需要使用,不能互相影响
var cur = pre.slice(0);
cur.push(node.val);
// 情况2
if(node.val == exp && node.left==null && node.right==null){
resArr.push(cur);
return;
}
// 情况3。注意更新参数
nextLayer(node.left, exp-node.val, cur, resArr);
nextLayer(node.right, exp-node.val, cur, resArr);
}
查看5道真题和解析
