C++ C+中引用的使用+;

C++ C+中引用的使用+;,c++,C++,我正在编写代码来解决“恢复二进制搜索树”问题 首先,我编写了这段代码,将三个指针从recoverTree函数中取出,如下所示: class Solution { public: TreeNode *pre; TreeNode *first; TreeNode *second; void recoverTree(TreeNode *root) { inOrder(root); int temp = first->val;

我正在编写代码来解决“恢复二进制搜索树”问题

首先,我编写了这段代码,将三个指针从recoverTree函数中取出,如下所示:

class Solution {
public:
    TreeNode *pre;
    TreeNode *first;
    TreeNode *second;

    void recoverTree(TreeNode *root) {

        inOrder(root);
        int temp = first->val;
        first->val = second->val;
        second->val = temp;
        return;
    }

    void inOrder(TreeNode *root) {
        if (!root) return;
        inOrder(root->left);
        if (!pre) {
            pre = root;
        } else {
            if (pre->val > root->val) {
                if (!first) first = pre;
                second = root;
            }
            pre = root;
        }
        inOrder(root->right);
    }

};
class Solution {
public:

    void recoverTree(TreeNode *root) {
        TreeNode *pre;
        TreeNode *first;
        TreeNode *second;
        inOrder(root, pre, first, second);
        int temp = first->val;
        first->val = second->val;
        second->val = temp;
        return;
    }

    void inOrder(TreeNode *root, TreeNode *&pre, TreeNode *&first, TreeNode *&second) {
        if (!root) return;
        inOrder(root->left, pre, first, second);
        if (!pre) {
            pre = root;
        } else {
            if (pre->val > root->val) {
                if (!first) first = pre;
                second = root;
            }
            pre = root;
        }
        inOrder(root->right, pre, first, second);
    }

};
它运行良好,通过了所有测试。然后我想也许不把三个指针的定义放在函数之外。所以我写了这样的东西:

class Solution {
public:
    TreeNode *pre;
    TreeNode *first;
    TreeNode *second;

    void recoverTree(TreeNode *root) {

        inOrder(root);
        int temp = first->val;
        first->val = second->val;
        second->val = temp;
        return;
    }

    void inOrder(TreeNode *root) {
        if (!root) return;
        inOrder(root->left);
        if (!pre) {
            pre = root;
        } else {
            if (pre->val > root->val) {
                if (!first) first = pre;
                second = root;
            }
            pre = root;
        }
        inOrder(root->right);
    }

};
class Solution {
public:

    void recoverTree(TreeNode *root) {
        TreeNode *pre;
        TreeNode *first;
        TreeNode *second;
        inOrder(root, pre, first, second);
        int temp = first->val;
        first->val = second->val;
        second->val = temp;
        return;
    }

    void inOrder(TreeNode *root, TreeNode *&pre, TreeNode *&first, TreeNode *&second) {
        if (!root) return;
        inOrder(root->left, pre, first, second);
        if (!pre) {
            pre = root;
        } else {
            if (pre->val > root->val) {
                if (!first) first = pre;
                second = root;
            }
            pre = root;
        }
        inOrder(root->right, pre, first, second);
    }

};

但这不起作用。我对引用的使用有什么问题吗?还是其他导致错误的原因?

看到指向指针的引用有点不寻常,看到有人试图指向引用更奇怪。你想在这里干什么?还值得标记任何未作为
const
操作的参数。您确定需要对指针的引用,还是只需要对节点的引用?同时使用
*
&
与仅使用
TreeNode&
是完全不同的。