JZ049从根节点到叶子节点的数字之和

📃 题目描述

题目链接:从根节点到叶子节点的数字之和相同题目

image-20220519214401667

🔔 解题思路

方法一:递归回溯,主要判断好:当前结点传什么值进来,我传入的是上一个节点加入节点值后扩大十倍

class Solution {
public: 
    int res = 0;
    int sumNumbers(TreeNode* root) {
        backTracking(root, 0);
        return res;
    }
    void backTracking(TreeNode *root, int num) {
        if (!root->left && !root->right) {
             res += (num + root->val);
             return;
        }

        num = (num + root->val) * 10;//传入扩大十倍的值;
        if (root->left) {
            backTracking(root->left, num);
        }
        if (root->right) {
            backTracking(root->right, num);
        }
    }
};

方法二:迭代深度优先(用栈),一个栈保存节点,另一个栈保存到当前节点的路径值,比如前面经过数值1,经过数值2,才到当前节点数值4,那么当前节点的路径值为124;

当然也可以用广度优先搜索(有队列)

class Solution {
public:
    int sumNumbers(TreeNode* root) {
        stack<TreeNode*> treeSt;//保存节点指针
        stack<int> sumSt; //保存节点的路径值
        treeSt.push(root);
        sumSt.push(root->val);
        int res = 0;
        while (!treeSt.empty()) {
            TreeNode *cur = treeSt.top();
            treeSt.pop();
            int nodeSum = sumSt.top();
            sumSt.pop();

            if (!cur->left && !cur->right) {
                res += nodeSum;
            }

            if (cur->left) {
                treeSt.push(cur->left);
                sumSt.push(nodeSum * 10 + cur->left->val);
            }
            if (cur->right) {
                treeSt.push(cur->right);
                sumSt.push(nodeSum * 10 + cur->right->val);
            }
        }
        return res;
    }
};

💥 复杂度分析

  • 时间复杂度:o(n);
  • 空间复杂度:O(n);
posted @ 2022-05-19 21:55  D-booker  阅读(90)  评论(0编辑  收藏  举报