二叉树---路径总和

题目:

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false

叶子节点 是指没有子节点的节点。

思路一:递归法。

第一步:确定参数与返回值。参数为树节点,一个int类型的计数器,返回值为bool类型

第二步:确定终止条件。用递减,让计数器count初始为目标和,然后每次减去遍历路径节点上的数值。如果最后count == 0,同时到了叶子节点的话,说明找到了目标和。如果遍历到了叶子节点,count不为0,就是没找到。

第三步:确定单层递归逻辑。因为终止条件是判断叶子节点,所以递归的过程中就不要让空节点进入递归了。递归函数是有返回值的,如果递归函数返回true,说明找到了合适的路径,应该立刻返回。

代码:

    public boolean hasPathSum(TreeNode root, int targetSum) {
        if(root==null) return false;
        return traversal(root,targetSum-root.val);
    }
    public boolean traversal(TreeNode node,int count){
        if(node.left==null&&node.right==null&&count==0) return true;//叶子节点,且路径和为目标值
        if(node.left==null&&node.right==null) return false;//叶子节点,路径和不为目标值,回溯判断其他路径
        if(node.left!=null){
            count-=node.left.val;
            if(traversal(node.left,count)) return true;
            count+=node.left.val;//回溯
        }
        if(node.right!=null){
            count-=node.right.val;
            if(traversal(node.right,count)) return true;
            count+=node.right.val;//回溯
        }
        return false;
    }

思路二:迭代法。使用前序遍历,一个栈存放前序遍历的节点,一个栈存放根节点到该节点的值。

代码:

 public boolean hasPathSum(TreeNode root, int targetSum) {
        if(root==null) return false;
        Stack<TreeNode> stack1=new Stack<>();//前序遍历栈
        Stack<Integer> stack2=new Stack<>();//记录根节点到每个节点的值
        stack1.push(root);
        stack2.push(root.val);
        while(!stack1.isEmpty()){
            int len=stack1.size();
            for(int i=0;i<len;i++){
                TreeNode node=stack1.pop();
                int sum=stack2.pop();
                if(node.left==null&&node.right==null&&sum==targetSum) return true;
                if(node.right!=null){
                    stack1.push(node.right);
                    stack2.push(sum+node.right.val);
                }
                if(node.left!=null){
                    stack1.push(node.left);
                    stack2.push(sum+node.left.val);
                }
            }
        }
        return false;
    }

相关推荐

  1. ---路径总和

    2024-07-20 17:16:04       18 阅读
  2. 路径总和系列问题

    2024-07-20 17:16:04       58 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 17:16:04       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 17:16:04       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 17:16:04       45 阅读
  4. Python语言-面向对象

    2024-07-20 17:16:04       55 阅读

热门阅读

  1. windows 安装 kubectl 并连接到 k8s 集群【图文教程】

    2024-07-20 17:16:04       21 阅读
  2. computeIfAbsent 和 putIfAbsent

    2024-07-20 17:16:04       19 阅读
  3. 微软Edge浏览器全解析教程

    2024-07-20 17:16:04       18 阅读
  4. 如何使用unittest框架来编写和运行单元测试

    2024-07-20 17:16:04       20 阅读
  5. 数学建模熵权法

    2024-07-20 17:16:04       21 阅读
  6. RabbitMQ线程和连接模型详解

    2024-07-20 17:16:04       22 阅读
  7. 探索现代Web开发:WebKit的剪贴板API革新

    2024-07-20 17:16:04       26 阅读
  8. Node.js 路由

    2024-07-20 17:16:04       18 阅读