题目描述
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
思路:
- 前序遍历二叉树,每次更新当前路径的和curtSum;
- 判断当前结点是否是叶子结点,以及curtSum是否等于expectNumber。如果是,把当前路径保存在res结果中;
- 若不符合条件,则弹出此结点。
二叉树的遍历:
递归前序遍历:
var preOrder = function (node) {
if (node) {
console.log(node.value);
preOrder(node.left);
preOrder(node.right);
}
}
本题答案:
function FindPath(root, expectNumber) {
var result = [];
if (root === null) {
return result;
}
dfsFind(root, expectNumber, [], 0, result);
return result;
}
function dfsFind(root, expectNumber, path, currentSum, result) {
currentSum += root.val;
path.push(root.val);
if (currentSum == expectNumber && root.left == null && root.right == null) {
result.push(path.slice(0));
}
if (root.left != null) {//如果没有这个判断条件,会报错:val属性不存在;
dfsFind(root.left, expectNumber, path, currentSum, result);
}
if (root.right != null) {
dfsFind(root.right, expectNumber, path, currentSum, result);
}
path.pop();//注意:在JS中数组是动态增长和删除的,所以要出栈。
}
var root = {
val: 10,
left: {
val: 5,
left: {
val: 4
},right:{val:7}
},
right: {
val: 12,
}
};
FindPath(root,22);