递归的一个问题?

发布于 2022-09-05 23:20:11 字数 1374 浏览 25 评论 0

在做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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

她说她爱他 2022-09-12 23:20:11

跑了一下,理解了你的问题.
第二个方式提交后可以AC的,在评论里我说这两个算法本质上是一样的,都是对中序遍历的一种变形(先右后左).

第一个提交失败,实际上可以猜一下原因.

2 / 212 test cases passed.

测试用例分别是:

5 2 13
2 1 3

然后第二个输入序列计算的结果是:

[25,26,23]

正确答案应该是5, 6, 3, 每个结果都在期望值的基础上增加了20, 而这里用到了static变量. 很容易猜到测试用例的调用接口的方法:

...
Solution *s;
s->convertBST(root1);
s->convertBST(root2);

调用完第一个root1, 静态变量的状态并没有被清空.而这个遗留的数正是第一个测试用例的左树结果 20.
方式2,就没有这个问题了,每次调用接口的时候,入口处sum的值就是0.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文