描述
给定一个二叉树root和一个值 sum ,判断是否有从根节点到叶子节点的节点值之和等于 sum 的路径。
1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点
2.叶子节点是指没有子节点的节点
3.路径只能从父节点到子节点,不能从子节点到父节点
4.总节点数目为n
例如:
给出如下的二叉树,\ sum=22 sum=22,
返回true,因为存在一条路径 5\to 4\to 11\to 25→4→11→2的节点值之和为 22
数据范围:
1.树上的节点数满足 0 \le n \le 100000≤n≤10000
2.每 个节点的值都满足 |val| \le 1000∣val∣≤1000
要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)
进阶:空间复杂度 O(树的高度)O(树的高度),时间复杂度 O(n)O(n)
思路:这一题其实考的是深度优先路径,根据题意将深度优先的根节点到叶子节点之间的和与输入的sum做比较,如果相等返回true 否则 false。我们需要获取到每一条路径,在叶子节点处做运算,如果符合条件,将返回true。否则我们需要删除该路径,进入到下一次路径中。如果没有一条符合的返回false。因为这里用了回调无法直接返回,用了一个变量保存;
function hasPathSum( root , sum ) {
// write code here
if(!root) return false;
let res = [];
let leaf = [];
let temp = false;
function cd(root, index){
if(!root) return ;
root.flg = true;
res.push(root);
if(!root.right && !root.left){
let sum2 = 0
for(let i = 0; i < res.length; i++){
sum2 += res[i].val;
}
if(sum2 === sum) {
temp = true;
} else {
let idx = 0;
for(let i = res.length - 1; i >=0 ; i--){
let left = res[i].left || '';
let right = res[i].right || '';
if(left && !left.flg || right && !right.flg){
idx = i;
break;
}
}
res = res.slice(0, idx + 1);
}
}
cd(root.right, index+1);
cd(root.left, index+1);
}
cd(root,0);
return temp;
}