新农上路
- 积分
- 98
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2015-3-9
- 最后登录
- 1970-1-1
|
Recursive的话就是典型的 DFS,中间结果的 sum 都当做一个参数传到下一层递归。
如果要 Iterative 的话就是把 DFS 写成 Non-recursive的,也就是用 stack 实现。这时需要保存中间结果的 sum,用另一个 stack 可以解决,楼上所说的用一个 int 保存中间结果,我没有想出来怎么实现,因为在遇到叶子节点的时候,不知道要在 sum 里减掉多少回退到上一层,可能回退的层数不是1。
粗略写的代码如下:
#include <iostream>
#include <stack>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int v) : val(v), left(NULL), right(NULL) {}
};
void pathSumRecHelper(TreeNode *root, int sum, int &res) {
if (root->left == NULL && root->right == NULL) {
sum += root->val;
res += sum;
return;
}
if (root->left != NULL) pathSumRecHelper(root->left, sum + root->val, res);
if (root->right != NULL) pathSumRecHelper(root->right, sum + root->val, res);
}
int pathSumRec(TreeNode *root) {
if (root == NULL) return 0;
int res = 0;
pathSumRecHelper(root, 0, res);
return res;
}
int pathSumItr(TreeNode *root) {
if (root == NULL) return 0;
stack<TreeNode *> node_stack;
stack<int> sum_stack;
int res = 0;
node_stack.push(root);
sum_stack.push(root->val);
while (!node_stack.empty()) {
TreeNode *node = node_stack.top();
int sum = sum_stack.top();
node_stack.pop();
sum_stack.pop();
if (node->left == NULL && node->right == NULL) {
res += sum;
}
if (node->left != NULL) {
node_stack.push(node->left);
sum_stack.push(sum + node->left->val);
}
if (node->right != NULL) {
node_stack.push(node->right);
sum_stack.push(sum + node->right->val);
}
}
return res;
}
int main(int argc, char const *argv[]) {
TreeNode *root = new TreeNode(1);
TreeNode *n1 = new TreeNode(2);
TreeNode *n2 = new TreeNode(5);
TreeNode *n3 = new TreeNode(3);
TreeNode *n4 = new TreeNode(4);
root->left = n1;
root->right = n2;
n1->left = n3;
n1->right = n4;
int sum = pathSumItr(root);
cout << sum << endl;
} |
|