LeetCode104|求根到叶子节点数字之和

时间:2022-07-28
本文章向大家介绍LeetCode104|求根到叶子节点数字之和,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

0x01,问题简述

给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。

例如,从根到叶子节点路径 1->2->3 代表数字 123。

计算从根到叶子节点生成的所有数字之和。

说明: 叶子节点是指没有子节点的节点。

0x02,示例

示例 1:

输入: [1,2,3]
    1
   / 
  2   3
输出: 25
解释:
从根到叶子节点路径 1->2 代表数字 12.
从根到叶子节点路径 1->3 代表数字 13.
因此,数字总和 = 12 + 13 = 25.
示例 2:

输入: [4,9,0,5,1]
    4
   / 
  9   0
 / 
5   1
输出: 1026
解释:
从根到叶子节点路径 4->9->5 代表数字 495.
从根到叶子节点路径 4->9->1 代表数字 491.
从根到叶子节点路径 4->0 代表数字 40.
因此,数字总和 = 495 + 491 + 40 = 1026.

0x03,题解思路

递归思路进行求解

0x04,题解程序


import java.util.LinkedList;

public class SumNumbersTest2 {
    public static void main(String[] args) {
        TreeNode t1 = new TreeNode(4);
        TreeNode t2 = new TreeNode(9);
        TreeNode t3 = new TreeNode(0);
        TreeNode t4 = new TreeNode(5);
        TreeNode t5 = new TreeNode(1);
        t1.left = t2;
        t1.right = t3;
        t2.left = t4;
        t2.right = t5;
        int sumNumbers = sumNumbers(t1);
        System.out.println("sumNumbers = " + sumNumbers);

    }

    public static int sumNumbers(TreeNode root) {
        if (root == null) {
            return 0;
        }
        LinkedList<TreeNode> queue = new LinkedList<>();
        LinkedList<Integer> path = new LinkedList<>();
        queue.add(root);
        path.add(root.val);
        int sum = 0;
        while (!queue.isEmpty()) {
            TreeNode node = queue.pollLast();
            Integer pollLast = path.pollLast();
            if (node.left == null && node.right == null) {
                sum += pollLast;
            }
            if (node.left != null) {
                queue.add(node.left);
                path.add(pollLast * 10 + node.left.val);
            }
            if (node.right != null) {
                queue.add(node.right);
                path.add(pollLast * 10 + node.right.val);
            }
        }
        return sum;
    }
}

0x05,题解程序图片版

0x06,总结一下

对于树结构,理解最基本的前序遍历,中序遍历是基本的,这道题自己本来想着利用利用递归的思路进行解决,写着写着想着利用队列的特性进行解决一下,就这样利用队列的数据结构来解决了,这里给下使用递归的方式进行解决的程序


import java.util.LinkedList;

public class SumNumbersTest2 {
    public static void main(String[] args) {
        TreeNode t1 = new TreeNode(4);
        TreeNode t2 = new TreeNode(9);
        TreeNode t3 = new TreeNode(0);
        TreeNode t4 = new TreeNode(5);
        TreeNode t5 = new TreeNode(1);
        t1.left = t2;
        t1.right = t3;
        t2.left = t4;
        t2.right = t5;
        int sumNumbers = sumNumbers2(t1);
        System.out.println("sumNumbers = " + sumNumbers);

    }


    private static int sum = 0;

    public static int sumNumbers2(TreeNode root) {
        if (root == null) {
            return 0;
        }
        dfs(root, 0);
        return sum;
    }

    private static void dfs(TreeNode root, int father) {
        if (root == null) {
            return;
        }
        int cur = father * 10 + root.val;
        if (root.left == null && root.right == null) {
            sum += cur;
        }
        dfs(root.left, cur);
        dfs(root.right, cur);
    }
}

递归结构题解程序图片版