- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好吧,我尝试通过网络寻找解决方案,但找不到任何解决我的问题的方法。
我正在为类编写作业,要求我们使用模板进行二叉树搜索。我已经在之前的类(class)中构建了一个整数二叉搜索树,所以这基本上是同一个程序,只是做了一些调整(最重要的是模板)。上一个类制作的程序运行得非常好,但在应用模板后,它给了我一组非常奇怪的错误:
1>tester.obj : error LNK2019: unresolved external symbol "public: __thiscall binTree<int>::~binTree<int>(void)" (??1?$binTree@H@@QAE@XZ) referenced in function _main
1>tester.obj : error LNK2019: unresolved external symbol "public: void __thiscall binTree<int>::deleteNode(int const &)" (?deleteNode@?$binTree@H@@QAEXABH@Z) referenced in function _main
1>tester.obj : error LNK2019: unresolved external symbol "public: bool __thiscall binTree<int>::find(int const &)" (?find@?$binTree@H@@QAE_NABH@Z) referenced in function _main
1>tester.obj : error LNK2019: unresolved external symbol "public: int __thiscall binTree<int>::height(void)" (?height@?$binTree@H@@QAEHXZ) referenced in function _main
1>tester.obj : error LNK2019: unresolved external symbol "public: void __thiscall binTree<int>::postorderTraversal(void)" (?postorderTraversal@?$binTree@H@@QAEXXZ) referenced in function _main
1>tester.obj : error LNK2019: unresolved external symbol "public: void __thiscall binTree<int>::preorderTraversal(void)" (?preorderTraversal@?$binTree@H@@QAEXXZ) referenced in function _main
1>tester.obj : error LNK2019: unresolved external symbol "public: void __thiscall binTree<int>::inorderTraversal(void)" (?inorderTraversal@?$binTree@H@@QAEXXZ) referenced in function _main
1>tester.obj : error LNK2019: unresolved external symbol "public: void __thiscall binTree<int>::insert(int const &)" (?insert@?$binTree@H@@QAEXABH@Z) referenced in function _main
1>tester.obj : error LNK2019: unresolved external symbol "public: __thiscall binTree<int>::binTree<int>(void)" (??0?$binTree@H@@QAE@XZ) referenced in function _main
我的代码分为 BTS 类的 header 、包含函数的 cpp 文件和 cpp 测试程序。
BinTree.h :
#pragma once
#include <iostream>
#include <string>
using namespace std;
//***** FUNCTION DESCRIBED BRIEFLY IN CPP FILE
template<class T>
class binTree
{
//the node struct
struct btnode {
T info;
btnode* left;
btnode* right;
};
private:
btnode* root; //the root
void remove(btnode* &node);
int heightRecursive(btnode *node);
void destroyRecursive(btnode*);
bool leaf(btnode* node) const;
// recursive traversals
void inorderRecursive(btnode* node);
void preorderRecursive(btnode* node);
void postorderRecursive(btnode* node);
public:
binTree(void);
int height();
void insert(const T &inData);
bool find (const T &inData);
void deleteNode(const T &inData);
~binTree(void);
// traversal
void inorderTraversal();
void preorderTraversal();
void postorderTraversal();
};
BinTree.cpp :
#include "BinTree.h"
//constructor, sets the root equal to NULL
template<class T> binTree<T>::binTree(void)
{
root = NULL;
}
//inserts into the tree; if the tree is empty, it inserts to the root
// if the tree already has the variable, it outputs a message and exits
// other wise, it will search for an appropiate place to fit the variable in
template<class T> void binTree<T>::insert(const T &inData)
{
btnode *newnode, *current, *parentOfCurrent;
newnode = new btnode;
newnode->info = inData;
newnode->left = newnode->right = NULL;
if (root == NULL) {
root = newnode;
cout << "added to root\n";
return; }
current = root;
while(current != NULL) {
parentOfCurrent = current;
if(current->info == inData)
{
cout << inData << " already exists in tree. Duplicates not allowed!\n";
return;
}
else if(current->info > inData)
current = current->left;
else
current = current->right;
}
if (parentOfCurrent->info > inData)
parentOfCurrent->left = newnode;
else
parentOfCurrent->right = newnode;
}
//--------------- inorder traversal ----------------------
//calls the inorderTraversal using the root
template <class T> void binTree<T>::inorderTraversal()
{
if(root==NULL)
cout << "Empty tree\n";
else {
inorderRecursive(root);
cout << '\n';
}
}
//Private variable, travels recursively in inorder accross the tree, takes in a btnode pointer
template <class T> void binTree<T>::inorderRecursive(btnode* node) //left, node, right
{
if(node != NULL) {
inorderRecursive(node->left);
cout << node->info << ", ";
inorderRecursive(node->right);
}
}
//------------------ preorder traversal-------------
//calls the preOrderTraversal using the root
template <class T> void binTree<T>::preorderTraversal()
{
if(root==NULL)
cout << "Empty tree\n";
else {
preorderRecursive(root);
cout << '\n';
}
}
//Private variable, travels recursively in preorder accross the tree, takes in a btnode pointer
template <class T> void binTree<T>::preorderRecursive(btnode* node) //node, left, right
{
if(node != NULL) {
cout << node->info << ", ";
preorderRecursive(node->left);
preorderRecursive(node->right);
}
}
//------------ postorder traversal-----------------
//calls the postOrderTraversal using the root
template <class T> void binTree<T>::postorderTraversal()
{
if(root==NULL)
cout << "Empty tree\n";
else {
postorderRecursive(root);
cout << '\n';
}
}
//Private variable, travels recursively in postorder accross the tree, takes in a btnode pointer
template <class T> void binTree<T>::postorderRecursive(btnode* node)
{
if(node != NULL) {
postorderRecursive(node->left);
postorderRecursive(node->right);
cout << node->info << ", ";
}
}
//-------
//searches the tree and returns either true or false if found or not found
template<class T> bool binTree<T>::find(const T &inData)
{
bool rv = false;
btnode *current;
if(root == NULL)
return rv;
current = root;
while(current != NULL && rv == false)
{
if (current->info == inData)
rv = true;
else if (current->info > inData)
current = current->left;
else
current = current->right;
}
return rv;
}
//deletes a node using the remove function. If the tree is empty or the variable
// is not found, it will send a message and abort.
template <class T> void binTree<T>::deleteNode(const T &inData)
{
btnode *current, *parentOfCurrent;
bool found = false;
if (root == NULL) {
cout << "The tree is empty, aborting...";
return;
}
current = root;
while(current != NULL)
{
if(current->info == inData) {
found = true;
break;
}
else {
parentOfCurrent = current;
if(current->info > inData)
current = current->left;
else
current = current->right;
}
}
if(!found)
cout << "\n" <<inData << " could not be found. Aborting...\n";
else if (current == root)
remove(root);
else if (parentOfCurrent->info > inData)
remove(parentOfCurrent->left);
else
remove(parentOfCurrent->right);
}
//
template <class T> void binTree<T>::remove(btnode* &node) // parent's node with address of
//node to be deleted. Sent in by ref. So parent's node changed here
{
btnode *current, *parentOfCurrent, *temp;
if(node==NULL) {
cout << "\nCannot delete NULL node.\n";
return; //the return is here because if the node is NULL, then it is also technically a leaf
}
else if(leaf(node) == true) //node is a leaf
{
temp = node;
node = NULL;
delete temp;
}
else
cout << "\nNode is not a leaf, cannot delete.\n";
}
//finds the height of the tree by passing root into the heightRecursive function
template <class T> int binTree<T>::height()
{
return heightRecursive(root);
}
//recursively travels the tree and keeps a counter each time it encounters a node
template <class T> int binTree<T>::heightRecursive(btnode* node)
{
if (node == NULL)
return 0;
else
return ( 1 + max(heightRecursive(node->left), heightRecursive(node->right)));
}
//destryuuctor; it calls the destroyRecursive function using root
template <class T> binTree<T>::~binTree(void)
{
destroyRecursive(root);
}
//travels the tree recursively, deleting every non-Null it encounters
template <class T> void binTree<T>::destroyRecursive(btnode* node)
{
if(node != NULL) {
destroyRecursive(node->left);
destroyRecursive(node->right);
delete node;
node = NULL;
}
}
//checks if the node passed as an argument is a leaf, returns true or false
template <class T> bool binTree<T>::leaf(btnode* node) const
{
bool aLeaf = false;
if(node->left == NULL && node->right == NULL)
aLeaf = true;
return aLeaf;
}
测试器.cpp :
#include "BinTree.h"
int main()
{
binTree<int> example;
int arr[] = { 75,43,77,29,52,82,35,56,79,32,40,90,48,47 };
//inserts the array of integers into the tree
for(int i=0; i < 14; i++)
example.insert(arr[i]);
//---------------Displays tree before changes-------------------
cout << "In order traversal:\n";
example.inorderTraversal();
cout << "Pre-order traversal:\n";
example.preorderTraversal();
cout << "Post-order traversal:\n";
example.postorderTraversal();
cout << "------------------Displays tree after changes---------------------\n";
example.insert(21);
cout << "\n------- inorder --------\n";
example.inorderTraversal();
cout << "\n------- preorder --------\n";
example.preorderTraversal();
cout << "\n------- postorder --------\n";
example.postorderTraversal();
cout << "\nheight=" << example.height() << endl<<endl;
//tests the find function
if (example.find(9))
cout << "found 9\n";
else
cout << "9 not found\n";
if (example.find(77))
cout << "found 77\n";
else
cout << "77 not found\n";
//tests the delete function by trying to delete an integer not in the tree
example.deleteNode(122);
//test the insert by inserting already existent integer
example.insert(77);
//tests the delete function by deleting 77
example.deleteNode(77);
cout << "\nAfter deleting 77 (inorder)\n";
example.inorderTraversal();
system("pause"); //don't worry, the system call will be gone in the final submission
return 0;
}
正如我之前所说,我相当确定这与我在模板实现方面做错了什么有关。如果是模板,能不能得到具体的代码片段,应该实现什么?我对模板还很陌生,所以这让我有点头疼。如果有帮助,我会使用 Visual Studios 2010。
最佳答案
这就是为什么它不起作用的原因: Splitting templated C++ classes into .hpp/.cpp files--is it possible?
TL;DR:您不能在 .h 和 .cpp 文件之间拆分模板类,将实现移动到 .h 文件。
关于c++ - BST 上的 "unresolved external symbol public: __thiscall",很可能是由于模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15845454/
我已经编写了一个 BSTLink 类来将 BST 转换为双向链表,但是在我尝试通过引用传递 BST 的节点指针的类中的构造调用抛出一个错误“没有匹配的函数来调用 BSTLink::construct(
当我使用 xgboost 为 2-cates classification problem 训练我的数据时,我想使用提前停止来获得最佳模型,但我对在我的预测中使用哪一个感到困惑,因为提前停止将返回 3
因为我找不到有用的东西所以我在这里问我的问题: 我们如何在不使用任何额外空间的情况下将 BST 转换为中序链接列表,然后再转换回“相同”的 BST。 到目前为止我已经尝试过的(虽然仍在做):我尝试了
我从我们的教授讲座幻灯片中获得了 BST(二叉搜索树)和随机 BST 的源代码,现在我想通过插入新元素来测试它们是否正常工作,然后我如何才能看到我的结果,如 http://cs.lmu.edu/~ra
给定两棵二叉树 T1 和 T2,您必须找到要在 T1 中完成的最少插入次数,以使其在结构上与 T2 相同。如果不可能则返回 -1。 注意事项 假设插入在 BST 中以正常方式完成。 假设在插入时,如果
我有一个始终将日期存储为 UTC 的网络应用程序,但它们需要分别以 GMT/BST 的形式显示给用户。 我有一个 UTC/GMT 日期(2013 年 3 月 30 日 22:00),我每小时移动一次以
题目地址:https://leetcode-cn.com/problems/largest-bst-subtree/ 题目描述 Given a binary tree, find the larg
注意:BST - 二叉搜索树(缩写) 正如标题所说,这是一项家庭作业,所以我不是在寻找答案。相反,我只需要一个正确方向的点。 对于作业,我应该创建一个 BST 类,它直接定义为最多包含 2 个 BST
我有一个插入方法和一个搜索方法,我正在考虑一种方法来循环二叉搜索树并使用像获取节点这样的方法,然后在另一个二叉搜索树上搜索它,如果它成立,那么我将其插入该元素,但问题是我无法想出一种基于索引获取节点的
二叉查找树 (Binary Search Tree, 简称 BST) 是一种基本的数据结构,其设计核心在于每个节点的值都满足以下性质: 左子树的所有节点值均小于当前节点值。 右子树的所有节
function validateBst(root, min=-Infinity, max=Infinity) { if (!root) return true; if (root.value
我有一个问题,我知道如何像这样计算树中的所有节点 return 1 + rightchild(tree->right) + rightchild(tree->left); 现在我的问题是如果一个节点在
给定一个二叉树根,任务是返回 任何子树的所有键的最大总和 这也是 二叉搜索树 (BST) . 假设 BST 定义如下: - 节点的左子树仅包含键小于节点键的节点。 - 节点的右子树仅包含键大于节点键的
我正在尝试使用 ScalaCheck 为 BST 创建一个 Gen,但是当我调用 .sample 方法时,它给了我 java.lang.NullPointerException。我哪里错了? seal
这些是我的领域: public class BSTSet extends AbstractSet { // Data fields private BSTNode root;
我需要在二叉搜索树中执行范围搜索功能,这将给出给定范围内的项目数量。我不明白如何在找到项目时增加计数值。因为,我必须使用递归函数&如果我在递归过程中将计数变量初始化为0,它将始终从0开始计数值,而不是
所以我正在尝试编写一个代码来返回二叉搜索树中的最小值。我知道这是树的最左边的值,并且我知道我需要它递归地向左运行,直到什么都没有为止。但是我的代码不起作用,我不知道为什么。任何帮助将不胜感激。 (de
我想返回一个包含树中所有键的字符串,按照它们的存储顺序。每个子树中的键应包含在括号中。 _7_ / \ _3_ 8 / \ 1
尝试运行递归算法来找出某棵树是否是 BST(二叉搜索树)。 boolean checkBST(Node root) { boolean isBST = true; if(root ==
使用下面的代码,每个时区都正确打印值,除了 BST import java.text.*; def format = "yyyy-MM-dd HH:mm:ssXXX" def dt = new Da
我是一名优秀的程序员,十分优秀!