129. 求根到叶子节点数字之和

151 阅读1分钟

方法一:递归传递curSum

class Solution {
    int res = 0;
    public int sumNumbers(TreeNode root) {
        dfs(root, 0);
        return res;
    }

    public void dfs(TreeNode node, int cur) {
        cur = cur * 10 + node.val;
        if (node.left == null && node.right == null) {
            res = cur + res;
            return;
        }
        if (node.left != null) {//处理一边null一边不null
            dfs(node.left, cur);
        }
        if (node.right != null) {//处理一边null一边不null
            dfs(node.right, cur);
        }
        
    }
}

或者:

class Solution {
    int res = 0;
    public int sumNumbers(TreeNode root) {
        dfs(root, 0);
        return res;
    }
    public void dfs(TreeNode node, int curSum) {
        if (node == null) {
            return;
        }
        curSum = curSum * 10 + node.val;
        if (node.left == null && node.right == null) {
            res += curSum;
        }
        dfs(node.left, curSum);
        dfs(node.right, curSum);

    }
}

方法二:全局变量curSum,回溯

写法1

class Solution {
    int curSum = 0;
    int res = 0;
    public int sumNumbers(TreeNode root) {
        dfs(root);
        return res;
    }
    public void dfs(TreeNode node) {
        curSum = curSum * 10 + node.val;
        if (node.left == null && node.right == null) {
            res += curSum;
            return;
        }
        if (node.left != null) {
            dfs(node.left);
        }
        curSum /= 10;
        if (node.right != null) {
            dfs(node.right);
        }
        curSum /= 10;
    }
}

写法2

class Solution {
    int curSum = 0;
    int res = 0;
    public int sumNumbers(TreeNode root) {
        dfs(root);
        return res;
    }
    public void dfs(TreeNode node) {
        if (node == null) {
            return;
        }
        curSum = curSum * 10 + node.val;
        if (node.left == null && node.right == null) {
            res += curSum;
        }
        dfs(node.left);
        dfs(node.right);//左右两个节点都访问完了,才可以撤销
        curSum /= 10;
    }
}