我试图编写一个简单的函数来决定在二叉树中也是一个二叉搜索树,作为学习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只有一个参数作为指针,因为我想把它混合起来才能理解差异。
答案 0 :(得分: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)
: 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) {
}