递归的一个问题?
在做leetcode的538. Convert BST to Greater Tree题的时候,遇到了一个递归的问题。
请问:为什么这两段代码在得到的结果上有区别?
代码一:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* convertBST(TreeNode* root) {
static int sum = 0;
if (root == NULL) {
return root;
}
convertBST(root->right);
root->val += sum;
sum = root->val;
convertBST(root->left);
return root;
}
};
代码二:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* convertBST(TreeNode* root) {
int sum = 0;
convert(root, sum);
return root;
}
void convert(TreeNode* root, int &sum) {
if (root == NULL) {
return ;
}
convert(root->right, sum);
root->val += sum;
sum = root->val;
convert(root->left, sum);
}
};
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
跑了一下,理解了你的问题.
第二个方式提交后可以AC的,在评论里我说这两个算法本质上是一样的,都是对中序遍历的一种变形(先右后左).
第一个提交失败,实际上可以猜一下原因.
测试用例分别是:
然后第二个输入序列计算的结果是:
正确答案应该是
5, 6, 3
, 每个结果都在期望值的基础上增加了20, 而这里用到了static
变量. 很容易猜到测试用例的调用接口的方法:调用完第一个root1, 静态变量的状态并没有被清空.而这个遗留的数正是第一个测试用例的左树结果 20.
方式2,就没有这个问题了,每次调用接口的时候,入口处
sum
的值就是0.