(46)~[112] 路径总和

88 阅读1分钟

这题没有思路,所以看题解有两种方法,一种递归,一种类似广度优先,中间逻辑判断的依据都是一样的,

方法一

var hasPathSum = function (root, targetSum) {
	// 类似广度优先
	if (!root) {
		return false;
	}
	const stack = [];
	const res = [];
	// 为循环开启
	stack.push(root);
	res.push(root.val)

	while (stack.length) {
		let top = stack.pop();
		let val = res.pop();
		// 这个到最后没有字节点的节点
		if (!top.left && !top.right) {
			
			// return val === targetSum; // 这样写 不对
			if (val === targetSum) return true
		}
	
		// 为下一轮循环开启
		if (top.left) {
			stack.push(top.left);
			res.push(val + top.left.val);
		}

		// 为下一轮循环开启
		if (top.right) {
			stack.push(top.right);
			res.push(val + top.right.val);
		}
	}
	return false;
};

方法二

var hasPathSum = function (root, targetSum) {
	// 类似广度优先
	if (!root) {
		return false;
	}

	if (!root.left && !root.right) {
		return targetSum - root.val === 0;
	}

	// 处理依据 每逢节点 都减 
	targetSum -= root.val;

	return hasPathSum(root.left, targetSum) || hasPathSum(root.right, targetSum)
/* 	// 一下代码不对 ,准备替换上一行
	if (root.left) {
		return hasPathSum(root.left, targetSum)
	}

	if (root.right) {
		return hasPathSum(root.right, targetSum)
	} */
};

力扣本题传送门