题目:
吐槽:题目中有个重点的概念,从根节点到叶子节点。叶子节点 的概念是:左孩子为null,右孩子也为null。
代码:
递归版本
public boolean hasPathSum(TreeNode root, int sum) {
//该终止条件:1.root开始为null的返回。2.递归到叶子节点后不满足条件的再次循环的结束条件
if(root == null){
return false;
}
//找到了叶子节点,进行结果判断。
if(root.left == null&& root.right == null){
return sum - root.val == 0;
}
//没找到叶子节点,继续往下寻找。只要有一个分支满足要求就返回
return hasPathSum(root.left,sum - root.val) || hasPathSum(root.right,sum -root.val);
}
递归改成非递归
public static class Bean{
public Bean(TreeNode node,int sum){
this.node = node;
this.sum = sum;
}
TreeNode node;
int sum;
}
/**
* 将递归版本改成非递归版本,通过手动压栈进行计算
* @param root
* @param sum
* @return
*/
public static boolean hasPathSum(TreeNode root, int sum) {
if(root == null){
return false;
}
//先序遍历,即深度优先遍历,
Stack<Bean> stack = new Stack<>();
stack.push(new Bean(root,sum-root.val));
while(!stack.empty()) {
Bean p = stack.pop();
if(p.node.right !=null){
stack.push(new Bean(p.node.right,p.sum-p.node.right.val));
}
if(p.node.left!=null){
stack.push(new Bean(p.node.left,p.sum-p.node.left.val));
}
if(p.node.left == null && p.node.right == null){
if(p.sum ==0){
return true;
}
}
}
return false;
}