关于二叉树的插入,传参的小问题

 #include <iostream>
using namespace std;
// 有序二叉树(二叉搜索树)
class Tree {
public:
    Tree (void) : m_root (NULL), m_size (0) {}

    void insert (int data) {
        //Node * a = new Node (data);
        insert (new Node (data), m_root);
        ++m_size;
    }
    void travel (void) {
        travel (m_root);
        cout << endl;
    }

private:
    // 节点
    class Node {
    public:
        Node (int data) : m_data (data),
            m_left (NULL), m_right (NULL) {}
        int m_data; // 数据
        Node* m_left; // 左树
        Node* m_right; // 右树
    };
    void insert (Node* node, Node*& tree) {
        if (! tree){
            tree = node;
        }
        else if (node) {
            if (node->m_data < tree->m_data)
                insert (node, tree->m_left);
            else
                insert (node, tree->m_right);

        }
    }


    void travel (Node* tree) {
        if (tree) {
            travel (tree->m_left);
            cout << tree->m_data << ' ';
            travel (tree->m_right);
        }
    }

    Node* m_root; // 树根
    size_t m_size; // 大小
};

int main (void) {
    Tree tree;
    tree.insert (50);
    tree.insert (60);
    tree.insert (70);
    tree.travel();
    return 0;
}

为什么insert (Node* node, Node*& tree)这句去掉引用,数据就显示不出来了

insert()当然要对数进行更改,当然就不能只传值,要传引用了。

去掉引用,你修改node,指向另一个对象,不会作用到实参上

 #include <iostream>
#include <vector>
using namespace std;


 void func(int *m,int *n)
 {
     *n = *m;
 }

int main (void) {
    int *a = new int(10);
    int *b = new int (20);
    func(a,b);
    cout << *a << ' '<< *b;

    return 0;
}

我觉得这个和上边的原理一样吗,但是这个不加引用就可以,结果是两个10

 // app1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <iostream>
using namespace std;
// 有序二叉树(二叉搜索树)
class Tree {
public:
    Tree (void) : m_root (NULL), m_size (0) {}

    void insert (int data) {
        Node * a = new Node (data);
        insert (&a, &m_root);
        ++m_size;
    }
    void travel (void) {
        travel (m_root);
        cout << endl;
    }

private:
    // 节点
    class Node {
    public:
        Node (int data) : m_data (data),
            m_left (NULL), m_right (NULL) {}
        int m_data; // 数据
        Node* m_left; // 左树
        Node* m_right; // 右树
    };
    void insert (Node** node, Node** tree) {
        if (!(*tree)){
            *tree = *node;
        }
        else if (*node) {
            if ((*node)->m_data < (*tree)->m_data)
                insert (&(*node), &(*tree)->m_left);
            else
                insert (&(*node), &(*tree)->m_right);

        }
    }


    void travel (Node* tree) {
        if (tree) {
            travel (tree->m_left);
            cout << tree->m_data << ' ';
            travel (tree->m_right);
        }
    }

    Node* m_root; // 树根
    size_t m_size; // 大小
};

int main (void) {
    Tree tree;
    tree.insert (50);
    tree.insert (60);
    tree.insert (70);
    tree.travel();
    return 0;
}

如果你不用引用,也可以用指针的指针

结果一样

我觉得下边那个栗子和上边二叉树insert传参的原理一样,为什么下边传入的就是地址,上边的就“不能作用于实参”了?