讨论/《算法面试题汇总》 - 二叉搜索树中第K小的元素/
《算法面试题汇总》 - 二叉搜索树中第K小的元素

再来看看C++中的传值和传引用

注意: 加了return的写法n++就必须写在if判断的前边了,不然退栈时还是n持续等于1,还是错误输出。

  • void dfs0(TreeNode* root, int& n, const int k)
    这样的定义方式对n采取的是传引用,就不用我们定义一个内部类或者结构体了,结果也是正确的。
    该输出以测试2为输入:
    cur n is:1
    cur root->val is:1
    cur n is:2
    cur root->val is:2
    cur n is:3
    cur root->val is:3
    cur n is:4
    cur root->val is:5
    cur n is:5
    cur root->val is:6
    这个输出就没有走3的右子树了,就是一个退栈的过程了。
  • void dfs1(TreeNode* root, int n, const int k)
    这样的写法就是传值了,和java中的传值方式是一样的,所以结果也是错误的。
    cur n is:1
    cur root->val is:1
    cur n is:1
    cur root->val is:2
    cur n is:1
    cur root->val is:3
    cur n is:2
    cur root->val is:4
    cur n is:1
    cur root->val is:5
    cur n is:2
    cur root->val is:6
    这样由于传值,n在退栈的时候都是1,所以始终不能等于3,所以始终找不到最终的正确结果,最终该输出是res的原始值0。
class Solution {
private:
    int res = 0, n = 0;
public:
    int kthSmallest(TreeNode* root, int k) {
        // 递归
        dfs(root, n, k);
        return res;
    }

    void dfs0(TreeNode* root, int& n, const int k) {
        if (root->left != nullptr) {
            dfs(root->left, n, k);
        }

        n++;
        cout<<"cur n is:"<<n<<endl;
        cout<<"cur root->val is:"<<root->val<<endl;

        if (n == k) {
            res = root->val;
            return ; // 加了return 语句可以提前结束递归
        }
        
        if (root->right != nullptr) {
            dfs(root->right, n, k);
        }
    }

    void dfs1(TreeNode* root, int n, const int k) {
        if (root->left != nullptr) {
            dfs(root->left, n, k);
        }

        n++;
        cout<<"cur n is:"<<n<<endl;
        cout<<"cur root->val is:"<<root->val<<endl;

        if (n == k) {
            res = root->val;
            return ; // 加了return 语句可以提前结束递归
        }
        
        if (root->right != nullptr) {
            dfs(root->right, n, k);
        }
    }
};
展开全部 3 讨论