给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。
叶子节点 是指没有子节点的节点。
分析:
找路径这类题使用层序遍历就不合适,而是使用深度遍历,对于二叉树,使用递归会简单一些。这道题要注意说的是叶子结点,即在判断是否和为target之前,最好先判断一些是否是叶子结点。然后只要有一个符合即可,所以要用或运算来递归左右子树。
递归法:
public boolean hasPathSum(TreeNode root, int targetSum) {
return sup(root,targetSum);
}
private boolean sup(TreeNode node,int target){
if(node==null) return false;
target-=node.val;
if(node.left==null&&node.right==null&&target==0) return true;
return sup(node.left,target)||sup(node.right,target);
}
迭代法:
用两个栈进行模拟,一个栈为正常的前序遍历,一个栈记录此时的路径和
public boolean hasPathSum(TreeNode root, int targetSum) {
if(root==null) return false;
Stack
Stack
s1.push(root);
s2.push(root.val);
while(!s1.isEmpty()){
int size = s1.size();
for(int i=0;i
int sum=s2.pop();
if(tmp.left==null&&tmp.right==null&&sum==targetSum) return true;
if(tmp.right!=null){
s1.push(tmp.right);
s2.push(sum+tmp.right.val);
}
if(tmp.left!=null){
s1.push(tmp.left);
s2.push(sum+tmp.left.val);
}
}
}
return false;
}
