美文网首页
2019-05-23bfs经典路径和

2019-05-23bfs经典路径和

作者: 咣超 | 来源:发表于2019-05-23 14:53 被阅读0次
import java.util.*;
public class Code_6路径总和 {  
    // 求一个二叉树的一条路径的和是否为给定的sum但是必须从根节点出发到叶子节点的和必须要到叶子节点
    // 我们这里用的是bfs思路是先将root节点减掉sum加入队列中然后每扫到一个点就将值再减掉点的值直到结果为0
    public static class TreeNode {
      int val;
      TreeNode left;
      TreeNode right;
      public TreeNode(int x) { 
          this.val = x; 
      }    
    }
    
    public static boolean hasPathSum(TreeNode root, int sum) {
        if(root == null) {  // 如果根节点直接为 null 直接return false
            return false;
        }
        if(root.val == sum && root.right == null && root.left == null) {
            return true; // 如果根节点的值为sum同时他没有左右孩子return true
        }
        Queue<TreeNode> q = new LinkedList<TreeNode>();
        root.val = sum - root.val;
        q.offer(root);
        while(!q.isEmpty()) {
            for(int i = 0; i < q.size(); i++) {
                TreeNode tmp = q.peek();
                if(tmp.left != null) { // 是否存在左孩子
                    tmp.left.val = tmp.val - tmp.left.val; // 减掉它父亲节点的值
                    if(tmp.left.val == 0 && tmp.left.right == null && tmp.left.left == null) {
                        return true;
                    }
                    q.offer(tmp.left);
                }
                if(tmp.right != null) { // 右孩子
                    tmp.right.val = tmp.val - tmp.right.val;
                    if(tmp.right.val == 0 && tmp.right.right == null && tmp.right.left == null) {
                        return true;
                    }
                    q.offer(tmp.right);
                }
                q.poll(); // 这个点的所有节点已经搜完了因为是二叉树就两次搜索所以要弹出
            }
            
        }
        return false;
    }
    public static void main(String[] args) {
        TreeNode t1 = new TreeNode(1);
        TreeNode t2 = new TreeNode(2);
        TreeNode t3 = new TreeNode(5);
        TreeNode t4 = new TreeNode(4);
        t1.left = t2;
        t1.right = t3;
        t2.left = t4;
        t2.right = null;
        t3.left = null;
        t3.right = null;
        t4.left = null;
        t4.right = null;
        boolean f = hasPathSum(t1, 1);
        System.out.println(f);
    }
}

相关文章

  • 2019-05-23bfs经典路径和

  • 学习笔记11:中央路径与边缘路径

    菲利普科特勒在经典著作《营销管理》中有提到,消费者的决策路径分中央决策路径和边缘决策路径。 中央路径:是指当人们拥...

  • 数据结构与算法-图的最短路径Dijkstra算法&Floyd算法

    最短路径 最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。在...

  • 算法 | 最短路径问题

    最短路径 最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径,在...

  • 《 经典路径错误》

    今天发现了一个经典错误。 这两个文件都是同时导入项目里面的,但是C++文件可以读取到,但是C文件读取不到。按道理说...

  • Go 解决最短路径问题

    最短路径问题 wiki:最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的...

  • 图的运用---最短路径

    一、概念: 最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。...

  • 致懒癌:5分钟,学会时间管理的最短有效路径

    什么是最短路径: 最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短...

  • 最短路径问题概述

    【问题概述】最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径.算...

  • 数据结构与算法学习 (14)最短路径求解

    最短路径问题是图研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。 算法具体的形...

网友评论

      本文标题:2019-05-23bfs经典路径和

      本文链接:https://www.haomeiwen.com/subject/znavzqtx.html