C ++中的二叉搜索树,叶子为空值,不适用于参考参数

Posted

技术标签:

【中文标题】C ++中的二叉搜索树,叶子为空值,不适用于参考参数【英文标题】:Binary search tree in C++ with leaves as null values not working with reference parameters 【发布时间】:2018-01-17 08:33:55 【问题描述】:

我正在尝试编写一个简单的函数来确定二叉树也是二叉搜索树作为学习 C++ 的一种方式。然而,我发现的第一个问题是在我的递归 Node struct 中定义末端叶子。

#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) 


解决方案是使用指针作为 CreateNode 的参数,但我不想这样做,因为 C++11 建议用引用参数替换指针参数。

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

更新: isBST 有一个参数作为指针,只是因为我想将它混合起来以了解区别。

【问题讨论】:

node.left -&gt; left; 究竟应该实现什么? “用引用替换指针”建议适用于传递指针指向的东西的目的,因为您不想复制它或因为您想修改它。当指针你要传递的东西时,你传递指针。 node.left -&gt; left; 建议您可能已经匆匆浏览了本书的前几章,需要修改基础知识。 【参考方案1】:

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

#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)
   :   datainit_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) 


【讨论】:

您能否扩展此评论“所有权转让且无可选供应” @user3139545 如果您使用引用作为参数,则无法获取传递值的所有权以使其成为例如节点的叶子。如果您使用引用作为参数,则无法提供“空”或“空”值,因为引用必须绑定到现有对象。 好的,这部分我不明白“可选供应”你所说的可选供应是什么意思,在这种情况下供应是什么意思? @user3139545 这部分在我之前评论的第二句中有所描述。

以上是关于C ++中的二叉搜索树,叶子为空值,不适用于参考参数的主要内容,如果未能解决你的问题,请参考以下文章

用于在C中为二叉搜索树分配内存的分段错误

C中的二叉树 - 多数据

c_cpp C ++中的二叉搜索树实现

c_cpp C语言中的二叉搜索树实现

红黑树——一个自平衡的二叉搜索树

二叉树与链表