C++ C+中的二叉搜索树+;将叶作为空值不使用引用参数

C++ C+中的二叉搜索树+;将叶作为空值不使用引用参数,c++,c++11,pointers,reference,C++,C++11,Pointers,Reference,我试图写一个简单的函数,在二叉树中决定一个二叉搜索树也是一种学习C++的方法。然而,我发现的第一个问题是在递归的节点结构中定义结束叶子 #include <iostream> #include <map> #include <string> struct Node { int data; Node* left; Node* right; }; Node CreateNode(const int data, const Node&

我试图写一个简单的函数,在二叉树中决定一个二叉搜索树也是一种学习C++的方法。然而,我发现的第一个问题是在递归的
节点结构中定义结束叶子

#include <iostream>
#include <map>
#include <string>

struct Node {
    int data;
    Node* left;
    Node* right;
};
Node CreateNode(const int data, const Node& left, const Node& right) {
    Node node;
    node.data = data;
    node.left -> left;
    node.right -> right;
    return node;
}

int main(int argc, const char * argv[]) {
    auto root = CreateNode(1, NULL, NULL);
    isBST(&root);

    return 0;
}

bool isBST(Node* root) {

}
#包括
#包括
#包括
结构节点{
int数据;
节点*左;
节点*右;
};
节点CreateNode(常量int数据、常量节点和左侧、常量节点和右侧){
节点;
node.data=数据;
node.left->left;
node.right->right;
返回节点;
}
int main(int argc,const char*argv[]{
自动根=CreateNode(1,NULL,NULL);
isBST(&root);
返回0;
}
bool isBST(节点*根){
}
解决方案是使用指针作为CreateNode的参数,但我不想这样做,因为C++11建议用引用参数替换指针参数

我的问题是,我如何在上面的代码中定义叶子,因为我不能像我的参数是指针那样只将它们设为空指针

更新:
isBST有一个参数作为指针,只是因为我想把它混合起来以理解差异。

引用在这种情况下并不真正合适,因为它们意味着没有所有权转移和可选供应。另一种方法是使用智能指针

#include <memory>
#include <utility>

struct Node;

using UniqueNode = ::std::unique_ptr<Node>;

struct Node 
{
   int data;
   UniqueNode left;
   UniqueNode right;

   explicit Node(void): data{} {}

   explicit Node(int const init_data, UniqueNode init_left, UniqueNode init_right)
   :   data{init_data}
   ,   left{::std::move(init_left)}
   ,   right{::std::move(init_right)}
   {}
};

// no need to manually write create function...
// UniqueNode CreateNode(const int data, UniqueNode left, UniqueNode right) 

int main(int argc, const char * argv[]) {
   UniqueNode root{::std::make_unique<Node>(42, nullptr, nullptr)};
   isBST(*root);

  return 0;
}

// takes a reference because no ownership is transferred, probably should be a member funciton
bool isBST(Node & root) {

}
#包括
#包括
结构节点;
使用UniqueNode=::std::unique\u ptr;
结构节点
{
int数据;
左单瓣;
单极右;
显式节点(void):数据{}{}
显式节点(int const init_数据,左单节点init_,右单节点init_)
:data{init_data}
,左{::std::move(init_left)}
,right{::std::move(init_right)}
{}
};
//无需手动编写创建函数。。。
//UniqueNode CreateNode(常量int数据、左UniqueNode、右UniqueNode)
int main(int argc,const char*argv[]{
单极根{::std::make_unique(42,nullptr,nullptr)};
isBST(*根);
返回0;
}
//接受引用,因为没有所有权转移,可能应该是成员函数
布尔isBST(节点和根){
}

node.left->left究竟是什么应该实现?当目的是传递指针指向的对象时,“用引用替换指针”建议适用,原因可能是您不想复制它,也可能是您想修改它。当指针是要传递的对象时,传递指针。
node.left->left
表明您可能已经匆匆读完了本书的前几章,需要修改基础知识。您是否可以在此评论上进一步说明“所有权转移和无可选供应”@user3139545如果您将引用用作参数,则无法获取传递值的所有权,例如将其作为节点的一个叶。如果使用引用作为参数,则无法提供“empy”或“null”值,因为引用必须绑定到现有对象。好的,这是这一部分我不理解“可选提供”您所说的可选提供是什么意思,在这种情况下,供应意味着什么?@user3139545这一部分在我之前评论的第二句中描述。