问题描述
- 关于二叉树的插入,传参的小问题
-
#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)这句去掉引用,数据就显示不出来了
解决方案
// 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;
}
如果你不用引用,也可以用指针的指针
结果一样
解决方案二:
去掉引用,你修改node,指向另一个对象,不会作用到实参上
解决方案三:
insert()当然要对数进行更改,当然就不能只传值,要传引用了。
解决方案四:
#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
解决方案五:
我觉得下边那个栗子和上边二叉树insert传参的原理一样,为什么下边传入的就是地址,上边的就“不能作用于实参”了?
时间: 2024-09-16 10:52:47