NC9 二叉树中是否存在节点和为指定值的路径

描述

给定一个二叉树和一个值\ sum sum,判断是否有从根节点到叶子节点的节点值之和等于\ sum sum 的路径,
例如:
给出如下的二叉树,\ sum=22 sum=22,


返回true,因为存在一条路径 5\to 4\to 11\to 25→4→11→2的节点值之和为 22

示例1

输入:

{1,2},0

复制返回值:

false

复制

示例2

输入:

{1,2},3

复制返回值:

true

递归实现

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param root TreeNode类 
     * @param sum int整型 
     * @return bool布尔型
     */

    //这道题 递归解法,找左右子树是否有 sum-root.val 的路径 不用打印路径了,相对简单一点
    public boolean hasPathSum (TreeNode root, int sum) {
        // write code here
        if(root==null){
            return false;
        }
        //处理叶子节点
        if(root.left==null&&root.right==null){
            if(root.val==sum){
                return true;
            }else{
                return false;
            }
        }



        boolean leftHas=hasPathSum(root.left,sum-root.val);
        boolean rightHas=hasPathSum(root.right,sum-root.val);
        boolean cur=leftHas||rightHas;
        return cur;
    }



}

非递归解决

上面使用的是递归的方式,我们还可以使用非递归的方式,在遍历的时候有两种方式,一种是从0开始累加,到叶子节点的时候如果累加的值等于sum,说明存在这样的一条路径。还一种是减,从根节点一直减下去,如果到叶子节点的时候,值等于叶子节点的值,说明也存在这样的一条路径。原理都一样,这里就以加的方式来看下代码该怎么写

public boolean hasPathSum(TreeNode root, int sum) {
    if (root == null)
        return false;
    Stack<TreeNode> stack = new Stack<>();
    stack.push(root);//根节点入栈
    while (!stack.isEmpty()) {
        TreeNode cur = stack.pop();//出栈
        //累加到叶子节点之后,结果等于sum,说明存在这样的一条路径
        if (cur.left == null && cur.right == null) {
            if (cur.val == sum)
                return true;
        }
        //右子节点累加,然后入栈
        if (cur.right != null) {
            cur.right.val = cur.val + cur.right.val;
            stack.push(cur.right);
        }
        //左子节点累加,然后入栈
        if (cur.left != null) {
            cur.left.val = cur.val + cur.left.val;
            stack.push(cur.left);
        }
    }
    return false;
}

讲到树的BFS,就是一层一层的往下打印,像下面这样

图片说明

他的代码如下

public void levelOrder(TreeNode tree) {
    if (tree == null)
        return;
    Queue<TreeNode> queue = new LinkedList<>();
    queue.add(tree);//相当于把数据加入到队列尾部
    while (!queue.isEmpty()) {
        //poll方法相当于移除队列头部的元素
        TreeNode node = queue.poll();
        System.out.println(node.val);
        if (node.left != null)
            queue.add(node.left);
        if (node.right != null)
            queue.add(node.right);
    }
}

在一层一层打印的时候,我们可以把值累加或累减都可以,这里使用累减的方式来看下代码

public boolean hasPathSum(TreeNode root, int sum) {
    if (root == null)
        return false;
    Queue<TreeNode> queue = new LinkedList<>();
    root.val = sum - root.val;
    queue.add(root);
    while (!queue.isEmpty()) {
        TreeNode node = queue.poll();
        //累减到根节点之后,结果为0,说明存在这样一条路径,直接返回true
        if (node.left == null && node.right == null && node.val == 0)
            return true;
        //左子节点累减
        if (node.left != null) {
            node.left.val = node.val - node.left.val;
            queue.add(node.left);
        }
        //右子节点累减
        if (node.right != null) {
            node.right.val = node.val - node.right.val;
            queue.add(node.right);
        }
    }
    return false;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值