您的位置:首页 > 其它

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

2022-05-19 21:55 489 查看

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

📃 题目描述

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

🔔 解题思路

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

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐