码迷,mamicode.com
首页 > 其他好文 > 详细

129. Sum Root to Leaf Numbers

时间:2018-10-08 11:26:17      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:用两个   技术分享   nod   tree   思路   ack   二叉树   alt   路径   

一、题目

  1、审题

技术分享图片

  2、分析

    给出一棵二叉树,求其从根节点到叶子节点的所有路径中所经过的节点组成的数值之和。  

 

二、解答

  1、思路: 

    方法一、

      采用递归进行 DFS,记录从根节点到叶子节点的所有的路径,在对数值进行累加。

    public int sumNumbers(TreeNode root) {
        
        List<List<Integer>> resultList = new ArrayList<List<Integer>>();
        
        sumNumbersHelper(resultList, new ArrayList<Integer>(), root);
        int sum = 0;
        for(List<Integer> list: resultList) {
            int tmp = 0;
            for(Integer i: list)
                tmp = tmp * 10 + i;
            sum += tmp;
        }
        return sum;
    }
    
    private void sumNumbersHelper(List<List<Integer>> resultList,
            ArrayList<Integer> targetList, TreeNode root) {

        if(root == null) {
            resultList.add(new ArrayList<>(targetList));
        }
        else {
            targetList.add(root.val);
            if(root.left == null && root.right == null) {
                sumNumbersHelper(resultList, targetList, root.left);
                
            }
            else if(root.left == null){    // 避免加入两次
                sumNumbersHelper(resultList, targetList, root.right);
            }
            else if(root.right == null){    // 避免加入两次
                sumNumbersHelper(resultList, targetList, root.left);
            }
            else {
                sumNumbersHelper(resultList, targetList, root.right);
                sumNumbersHelper(resultList, targetList, root.left);
                
            }
            targetList.remove(targetList.size() - 1);
        }
    }

 

    方法二、

      采用两个 Queue 进行层次遍历,其中 一个 Queue 记录节点,一个 Queue 记录从根节点到此节点经过的路径所组成的数值。

    public int sumNumbers2(TreeNode root) {
    
        if(root == null) 
            return 0;
        
        int sum = 0;
        Queue<TreeNode> nodeQueue = new LinkedList<>();
        Queue<Integer> valQueue = new LinkedList<>();
        nodeQueue.add(root);
        valQueue.add(root.val);
        
        while(!nodeQueue.isEmpty()) {
            
            root = nodeQueue.poll();
            if(root.left == null && root.right == null) {
                sum += valQueue.poll();
            }
            else{
                boolean flag = false;
                int val = 0;
                if(root.left != null) {
                    flag = true;
                    nodeQueue.add(root.left);
                    val = valQueue.poll();
                    valQueue.add(val*10 + root.left.val);
                }
                
                if(root.right != null) {
                    nodeQueue.add(root.right);
                    if(flag == false)
                        val = valQueue.poll();
                    valQueue.add(val*10 + root.right.val);
                }
            }
        }
        return sum;
    }

 

    方法三、采用 Stack 进行 PreOrder 并记录路径的和值

    public int sumNumbers4(TreeNode root) {
        
        if(root == null)
            return 0;
        
        Stack<TreeNode> nodeStack = new Stack<>();
        Stack<String> nodePath = new Stack<>();
        nodeStack.push(root);
        nodePath.push(root.val + "");
        int sum = 0;
        
        while(!nodeStack.isEmpty()) {
            TreeNode node = nodeStack.pop();
            String currentPath = nodePath.pop();
            if(node.right != null) {
                nodeStack.push(node.right);
                nodePath.push(currentPath + node.right.val);
            }
            if(node.left != null) {
                nodeStack.push(node.left);
                nodePath.push(currentPath + node.left.val);
            }
            if(node.left == null && node.right == null)
                sum += Integer.valueOf(currentPath);
        }
        return sum;
    }

 

    方法四、

      采用递归直接计算路径的和值。

    public int sumNumbers(TreeNode root) {
       return helper(root, 0);
    }
    
    private int helper(TreeNode root, int i) {
        if(root == null)
            return 0;
        if(root.left == null && root.right == null)
            return i * 10 + root.val;

        return helper(root.left, i * 10 + root.val) + helper(root.right, i * 10 + root.val);
    }

 

129. Sum Root to Leaf Numbers

标签:用两个   技术分享   nod   tree   思路   ack   二叉树   alt   路径   

原文地址:https://www.cnblogs.com/skillking/p/9752932.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!