二叉树&路径和

161 阅读2分钟

前言

“这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战

  1. NC5 二叉树根节点到叶子节点的所有路径和(中等)

根节点到叶子节点的所有路径和

描述 : 给定一个仅包含数字 0−9 的二叉树,每一条从根节点到叶子节点的路径都可以用一个数字表示。 例如根节点到叶子节点的一条路径是1→2→3,那么这条路径就用123 来代替。 找出根节点到叶子节点的所有路径表示的数字之和 例如:

这颗二叉树一共有两条路径, 根节点到叶子节点的路径 1→2 用数字 12 代替 根节点到叶子节点的路径 1→3 用数字 13 代替 所以答案为 12+13=25

思路分析:

  • 递归实现,二叉树相关的题目一般都可以用递归去实现 定义递归函数 明确递归函数的意义 调用 help(TreeNode root, int val) 函数 可以返回从 root 节点出发,当前值为val的情况下 到叶子节点的路径之和 base case 当前为 叶子节点 返回 val 左子节点不为空时 递归调用 右子树同理

  • 层级遍历 实现 复用之前层级遍历的代码, 多准备一个 List 记录对应节点的 val 在遍历过程中同步 处理 队列 和 list 集合 当前 遍历到的节点为 叶子节点时 更新最后的返回值

AC 代码:

DFS 实现版本

    public int sumNumbers (TreeNode root) {
        // write code here
        if(root == null){
            return 0;
        }
        return help(root, root.val);
    }
    
    
    int help(TreeNode root, int val){
        if(root.left == null && root.right == null){
            return val;
        }
        int ans = 0;
        if(root.left != null){
            ans+= help(root.left, val * 10 + root.left.val);
        }
        if(root.right != null){
            ans+= help(root.right, val * 10 + root.right.val);
        }
        return ans;
    }

BFS 的实现版本

    public int sumNumbers (TreeNode root) {
        if(root == null){
            return 0;
        }
        // write code here
        Queue<TreeNode> queue = new LinkedList<>();
        int ans = 0;

        List<Integer> temp = new ArrayList<>();

        queue.offer(root);
        temp.add(root.val);

        while (!queue.isEmpty()) {
            int size = queue.size();

            while (size-- > 0) {
                TreeNode cur = queue.poll();
                int val = temp.remove(0);
                if (cur.left != null) {
                    queue.offer(cur.left);
                    temp.add(val * 10 + cur.left.val);
                }

                if (cur.right != null) {
                    queue.offer(cur.right);
                    temp.add(val * 10 + cur.right.val);
                }

                if (cur.left == null && cur.right == null) {
                    ans +=val;
                }

            }
        }
        
        return ans;
    }