7.二叉树之路径总和|Java 刷题打卡

616 阅读4分钟

本文正在参加「Java主题月 - Java 刷题打卡」,详情查看<活动链接>

【Java 刷题打卡】 刷题比玩游戏好多了,成就感越来越强,每天坚持刷几道题,每天锻炼30分钟,等8块腹肌,等大厂offer.

😄

 \color{red}{~}

那就干吧! 这个专栏都是刷的题目都是关于二叉树的,我会由浅入深、循序渐进,刷题就是这样需要连续不断的记忆--艾宾浩斯记忆法2121112。二叉树的内容不多,但是都是每个程序员必备的,对了解红黑树、B+树、LSM树都非常有帮助等等

WAL+LSM-tree实现的leveldb和rocksdb

B+ 树的mysql

(HBASE) - LSM-tree的架构把random write转成sequential write,多层的compaction和lookup,存在写放大和读放大

TokuDB索引结构--Fractal Tree

还有更多,值得咱们发掘。

leecode 112. 路径总和

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

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

图片.png

输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22

输出:true

图片.png

输入:root = [1,2,3], targetSum = 5

输出:false


参考代码

定义一颗树

class TreeNode {
    int val;          // 头结点
    TreeNode left;    // 左子树
    TreeNode right;   // 右子树

    TreeNode(int x) {
        val = x;
    }
}


// 测试方法
 public static void main(String[] args) {
        TreeNode treeNode = new TreeNode(1);
        treeNode.left = new TreeNode(2);
        treeNode.right = new TreeNode(3);
        System.out.println("xxxx结果 = " + preorderTraversal(treeNode));
}        
  1. 要知道这是一棵树,只是通过数组的形式表现出来的

图片.png

简单的用这颗树来举例

比较简单,就是通过递归自顶向下的找到一棵树,用目标值sum减去左子树和右子树,看是否等于空,

因为等于空代表这颗树的左节点或者右节点就是最后的子节点。

JAVA语言版 递归


  public static  boolean hasPathSum(TreeNode root, int sum) {
        if(root == null) {
            return false;
        }
        if(root.val == sum && root.left == null && root.right == null) {
            return true;
        }
        sum -= root.val;
        return hasPathSum(root.left, sum) || hasPathSum(root.right, sum);

    }

JAVA语言版 迭代

迭代版其实也很简单,利用栈或者队列

可以想一想,队列还是栈比较好? 队列的性质就是先进先出,我们添加一个节点,就进行累加,如果左节点或右节点不为空,就加入队列,在弹出继续累加,如果累加之和等于目标值,结果返回true.

  1. 定义一个队列node,保存树(先进先出)

  2. 定义一个队列val,记录累加值

  3. 初始化队列node,将整棵树添加进队列,因为我还要根据这棵树的左节点或右节点判断。

  4. 取出根节点,记录累加值为根节点

  5. 队列node元素,不为0,因为咱要判断这颗树到底遍历完没

  6. 从队列node取出一个元素,就是刚刚加入进去这颗树啦

  7. 从队列val中,取出根节点,为累加值

8. 如果左节点或者右节点为空,说明到底了,看累加值是否等于目标值,如果等于返回true.

  1. 取出来的这颗树的左节点不为空,将以左节点为根的树加入队列node, 队列val累加值 = 累加值 + 左节点为根的左子树的根,其实就是它本身。 回到第5步,往下走。

  2. 取出来的这颗树的右节点不为空,将以右节点为根的树加入队列node, 队列val累加值 = 累加值 + 右节点为根的右子树的根,其实就是它本身。 回到第5步,往下走。

 class Solution {
    public boolean hasPathSum(TreeNode root, int sum) {
        if (root == null) {
            return false;
        }
        Queue<TreeNode> queNode = new LinkedList<TreeNode>();
        Queue<Integer> queVal = new LinkedList<Integer>();
        queNode.offer(root);
        queVal.offer(root.val);
        while (!queNode.isEmpty()) {
            TreeNode now = queNode.poll();
            int temp = queVal.poll();
            if (now.left == null && now.right == null) {
                if (temp == sum) {
                    return true;
                }
                continue;
            }
            if (now.left != null) {
                queNode.offer(now.left);
                queVal.offer(now.left.val + temp);
            }
            if (now.right != null) {
                queNode.offer(now.right);
                queVal.offer(now.right.val + temp);
            }
        }
        return false;
    }
}


真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话

求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️