zoukankan      html  css  js  c++  java
  • LeetCode.1022-根到叶路径二进制数之和(Sum of Root To Leaf Binary Numbers)

    这是小川的第381次更新,第410篇原创

    01 看题和准备

    今天介绍的是LeetCode算法题中Easy级别的第243题(顺位题号是1022)。给定二叉树,每个节点值为0或1.每个根到叶路径表示以最高有效位开始的二进制数。例如,如果路径为0 -> 1 -> 1 -> 0 -> 1,那么这可能表示二进制的01101,即13。

    对于树中的所有叶子节点,请考虑从根到该叶子节点的路径所代表的数字。返回这些数字的总和。

    例如:

          1
        /   
       0     1
      /    / 
     0   1 0   1
    

    输入:[1,0,1,0,1,0,1]
    输出:22
    说明:(100)+(101)+(110)+(111)= 4 + 5 + 6 + 7 = 22

    注意

    • 树中的节点数介于1和1000之间。

    • node.val是0或1。

    • 答案不会超过2^31 - 1。

    02 第一种解法

    递归的方式解题。

    结合题目给的示例来看,可以将该二叉树分为两部分,leftrightleft那一支有两条路径100和101,直接做加法就是4+5=9;right那一支也有两条路径110和111,直接做加法就是6+7=13,我们可以将求和拆分成左子树、右子树之和来做。

    如果当前节点为空,返回0。如果当前节点如果为叶子节点(没有左子节点和右子节点的节点),就返回此路径所表示的整数。计算路径上的二进制数,可以通用此代码:int val = val*2 + currentNodeValue;,和前天的那道题目在处理累加二进制字符串上类似。

    public int sumRootToLeaf(TreeNode root) {
        return getSum(root, 0);
    }
    
    public int getSum(TreeNode root, int sum) {
        if (root == null) {
            return 0;
        }
        // 换成 sum = (sum<<1) + root.val; 效果一样
        sum = sum*2 + root.val;
        // 当前节点为叶子节点时
        if (root.left == null && root.right == null) {
            return sum;
        }
        return getSum(root.left, sum) + getSum(root.right, sum);
    }
    

    03 第二种解法

    迭代的方式解题。借助两个栈来实现,思路和上面类似。

    public int sumRootToLeaf2(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int sum = 0;
        // 存节点
        Stack<TreeNode> stack = new Stack<TreeNode>();
        // 存路径所代表整数
        Stack<Integer> prevSum = new Stack<Integer>();
        stack.push(root);
        prevSum.push(root.val);
        while (!stack.isEmpty()) {
            TreeNode temp = stack.pop();
            Integer tempSum = prevSum.pop();
            // 左子树
            if (temp.left != null) {
                stack.push(temp.left);
                prevSum.push(tempSum*2 + temp.left.val);
            }
            // 右子树
            if (temp.right != null) {
                stack.push(temp.right);
                prevSum.push(tempSum*2 + temp.right.val);
            }
            // 叶子节点,累加完整路径所表示的整数
            if (temp.left == null && temp.right == null) {
                sum += tempSum;
            }
        }
        return sum;
    }
    

    04 小结

    算法专题目前已连续日更超过七个月,算法题文章249+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

    以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

  • 相关阅读:
    iOS缓存
    哈希表
    查找
    基数排序
    归并排序
    快速排序
    redis 的高并发的理解
    springboot的理解
    使用maven命令安装jar包到本地仓库
    linux Centos7 安装docker步骤
  • 原文地址:https://www.cnblogs.com/xiaochuan94/p/11179940.html
Copyright © 2011-2022 走看看