zoukankan      html  css  js  c++  java
  • 【Leetcode】129. 求根到叶子节点数字之和

    题目链接

    https://leetcode-cn.com/problems/sum-root-to-leaf-numbers/

    题目描述

    解题思路

    1.先序遍历(DFS)

    2.层序遍历(DFS)

    AC代码

    DFS解法一

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        List<String> ans = new LinkedList<>();
        void preOrderTraversal(TreeNode root,StringBuffer sb1){
            if(root==null) return;
            if(root.left == null && root.right == null){
                //必须新建两个局部变量,这是局部变量1。这样在递归弹出函数的时候,能够回到当初stringbuffer变量的状态,因为StringBuffer属于局部变量,是每个函数栈特有的。
                StringBuffer sb2 = new StringBuffer(sb1);
                sb2.append(root.val);
                String temp = sb2.toString();
                ans.add(temp);
                return;
            }
            //必须新建两个局部变量,这是局部变量2。
            StringBuffer sb = new StringBuffer(sb1);
            sb.append(root.val);
            preOrderTraversal(root.left,sb);
            preOrderTraversal(root.right,sb);      
        }
    
        public int stringToint(String s){
            int sum = 0;
            for(int i = s.length()-1; i >= 0; i--){
                sum += (s.charAt(i)-'0')*Math.pow(10,s.length()-1-i);
            }
            return sum;
        }
    
        public int sumNumbers(TreeNode root) {
            StringBuffer sb1 = new StringBuffer();
            preOrderTraversal(root,sb1);
            int tot = 0;
            for(int i = 0; i < ans.size(); i++){
                tot += stringToint(ans.get(i));
            }
            
            return tot;
        }
    }
    //将字符串转为数字,可以不调用Math.pow()函数
    int res = 0;
    for(int i = 0; i < s.length(); i++){
        res = res * 10 + (s.charAt(i)-'0');
    }
    

    DFS解法二

    这是官方解法,真的非常巧妙!!!!直接在递归的过程中就完成了计算。
    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
    
        public int dfs(TreeNode root, int sum){
            if(root == null) return 0;
            sum = sum*10+root.val;
            if(root.left==null&&root.right==null) return sum;
            int leftValue = dfs(root.left,sum);
            int rightValue = dfs(root.right,sum);
            return leftValue+rightValue;
        }
    
        public int sumNumbers(TreeNode root) {
            return dfs(root,0);
        }
    }
    

    DFS解法三

    class Solution {
        int ans = 0;
    
        public int sumNumbers(TreeNode root) {
            if (root == null) return 0;
            int temp = 0;
            dfs(root, temp);
            return ans;
        }
    
        public void dfs(TreeNode root, int temp) {
            temp = temp * 10 + root.val;
            if (root.left == null && root.right == null) {
                ans += temp;
                return;
            }
            if (root.left != null) {
                dfs(root.left, temp);
            }
            if (root.right != null) {
                dfs(root.right, temp);
            }
        }
    }
    
    作者:byakuya-2
    链接:https://leetcode-cn.com/problems/sum-root-to-leaf-numbers/solution/dfsyong-shi-ji-bai-100nei-cun-ji-bai-95-by-byakuya/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

    BFS解法

    class Solution {
        public int sumNumbers(TreeNode root) {
            if (root == null) {
                return 0;
            }
            int sum = 0;
            Queue<TreeNode> nodeQueue = new LinkedList<TreeNode>();
            Queue<Integer> numQueue = new LinkedList<Integer>();
            nodeQueue.offer(root);
            numQueue.offer(root.val);
            while (!nodeQueue.isEmpty()) {
                TreeNode node = nodeQueue.poll();
                int num = numQueue.poll();
                TreeNode left = node.left, right = node.right;
                if (left == null && right == null) {
                    sum += num;
                } else {
                    if (left != null) {
                        nodeQueue.offer(left);
                        numQueue.offer(num * 10 + left.val);
                    }
                    if (right != null) {
                        nodeQueue.offer(right);
                        numQueue.offer(num * 10 + right.val);
                    }
                }
            }
            return sum;
        }
    }
    
    作者:LeetCode-Solution
    链接:https://leetcode-cn.com/problems/sum-root-to-leaf-numbers/solution/qiu-gen-dao-xie-zi-jie-dian-shu-zi-zhi-he-by-leetc/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    
  • 相关阅读:
    Silverlight 之 断点调试
    Silverlight 之 浅析
    Silverlight 之 新建项目解析
    Silverlight 之 创建
    有关TCP和UDP 粘包 消息保护边界
    计算机网络杂项
    RTP
    如何取消Linux下,vi中显示的^M符号
    Linux下实现定时器Timer的几种方法
    UNIX网络编程——套接字选项
  • 原文地址:https://www.cnblogs.com/XDU-Lakers/p/13896251.html
Copyright © 2011-2022 走看看