建立二叉树、打印和搜索的程序 - Node Class C++
Program to set up a binary tree, print it & search - Node Class C++
我创建了一个程序,其中包含一个 class 节点,用于表示任何类型的二叉树(模板)。
在我的 Node.h class 中,我有两个构造函数,但是我不确定我是否正确地实现了它们。在构造函数中初始化值让我感到困惑。在我的 main.cpp 文件中,我有一个 setUpTree 函数。我的程序现在执行,但不打印设置的树。
我已经尝试了几个小时来解决这个问题,但没有结果。我对 C++、指针、构造函数等还没有真正的经验。
如果有人能帮助我修复我的代码,使 setUpTree 函数和 printTree 方法正常工作,我将不胜感激。
谢谢
Node.h Class:
#ifndef NODE_H
#define NODE_H
#include <iostream>
#include <string>
using namespace std;
//an object of type node holds 3 things
// - an item (of type t)
// - a left subtree
// - a right subtree
template<typename T>
class Node {
public:
Node(T item); //constructor to create a leaf node
Node(T item, Node *lft, Node *rht); //constructor which creates an internal node
~Node(); //Destructor
//public data member functions:
bool searchTree(T key);
void printTree();
private:
//private data member functions:
Node* left;
Node* right;
T item;
};
//constructor
template<typename T>
Node<T>::Node(T i, Node<T> *lft, Node<T> *rht) {
item = i;
left = NULL;
right = NULL;
}
//constructor
template <typename T>
Node<T>::Node(T i) { //should i be a parameter here?
item = i; //is this right for this constructor?
}
//destructor
template <typename T>
Node<T>::~Node() {
delete left;
delete right;
//delete;
}
//print tree method
template <typename T>
void Node<T>::printTree() {
if (left != NULL) {
left->printTree();
cout << item << endl;//alphabetical order
}
if (right != NULL) {
right->printTree();
//cout << item << endl; //post order
}
}
//search Tree method
template <typename T>
bool Node<T>::searchTree(T key) {
bool found = false;
if (item == key) {
return true;
}
if (left != NULL) {
found = left->searchTree(key);
if (found) return true;
}
if (right != NULL) {
return right->searchTree(key);
}
return false; //if left and right are both null & key is not the search item, then not found == not in the tree.
}
#endif
Main.cpp Class:
#include "Node.h"
#include <iostream>
using namespace std;
//set up tree method
Node<string> *setUpTree() {
Node<string> *s_tree =
new Node<string>("Sunday",
new Node<string>("monday",
new Node<string>("Friday"),
new Node<string>("Saturday")),
new Node<string>("Tuesday",
new Node<string>("Thursday"),
new Node<string>("Wednesday")));
return s_tree;
}
int main() {
Node<string> *s_tree;
s_tree = setUpTree(); //call setUpTree method on s_tree
cout << "Part 2 :Printing tree values: " << endl;
s_tree->printTree(); //call print tree method
cout << endl;
//search for range of tree values
//searchTree(s_tree, "Sunday");
//searchTree(s_tree, "Monday");
return 0;
}
首先setupTree
中的return应该是s_tree
。
其次,您通过一次添加每个项目来构建二叉树。我建议让 setupTree
接受一组值,然后您可以一次取一个值并构建树。
正如所指出的,左和右的默认值应该是 NULL。但是,我只是在声明中这样做,这样您就不必在每个未指定值的构造函数中重复它:
private:
//private data member functions:
Node* left = NULL;
Node* right = NULL;
T item;
我不知道这是否是唯一的问题,但是...如果您构造一片叶子,则必须将 left
和 right
指针设置为 NULL
template <typename T>
Node<T>::Node(T i) : left(NULL), right(NULL), item(i)
{ }
否则调用析构函数时
template <typename T>
Node<T>::~Node() {
delete left;
delete right;
//delete;
}
delete
被未定义的值调用;两次。
这是崩溃的完美秘诀。
你使用 left
或 right
检查指针是否为 NULL
的每个点中的其他问题,如 printTree()
或 searchTree()
中所做的那样: value 是未定义的,所以可以是非 NULL
,通过测试并且 printTree()
是通过具有未定义值
的指针调用的
-- 编辑--
建议的构造器。
template <typename T>
Node<T>::Node (T i, Node<T> * lft, Node<T> * rht)
: left(lft), right(right), item(i)
{ }
template <typename T>
Node<T>::Node (T i)
: left(NULL), right(NULL), item(i)
{ }
--- 编辑 2 ---
it is now printing some values at least ; monday sunday tuesday. not sure about the rest
看看你的printTree()
方法
模板
void Node::printTree() {
如果(左!= NULL){
左->printTree();
cout << item << endl;//字母顺序
}
if (right != NULL) {
right->printTree();
//cout << item << endl; //post order
}
}
如果 left
不是 NULL
,它只打印值 (item
) 。所以它不打印叶子的值。
建议:修改 printTree()
打印 item
即使 left
是 NULL
.
举例
template <typename T>
void Node<T>::printTree() {
if (left != NULL) {
left->printTree();
}
cout << item << endl;
if (right != NULL) {
right->printTree();
}
}
我创建了一个程序,其中包含一个 class 节点,用于表示任何类型的二叉树(模板)。
在我的 Node.h class 中,我有两个构造函数,但是我不确定我是否正确地实现了它们。在构造函数中初始化值让我感到困惑。在我的 main.cpp 文件中,我有一个 setUpTree 函数。我的程序现在执行,但不打印设置的树。
我已经尝试了几个小时来解决这个问题,但没有结果。我对 C++、指针、构造函数等还没有真正的经验。
如果有人能帮助我修复我的代码,使 setUpTree 函数和 printTree 方法正常工作,我将不胜感激。
谢谢
Node.h Class:
#ifndef NODE_H
#define NODE_H
#include <iostream>
#include <string>
using namespace std;
//an object of type node holds 3 things
// - an item (of type t)
// - a left subtree
// - a right subtree
template<typename T>
class Node {
public:
Node(T item); //constructor to create a leaf node
Node(T item, Node *lft, Node *rht); //constructor which creates an internal node
~Node(); //Destructor
//public data member functions:
bool searchTree(T key);
void printTree();
private:
//private data member functions:
Node* left;
Node* right;
T item;
};
//constructor
template<typename T>
Node<T>::Node(T i, Node<T> *lft, Node<T> *rht) {
item = i;
left = NULL;
right = NULL;
}
//constructor
template <typename T>
Node<T>::Node(T i) { //should i be a parameter here?
item = i; //is this right for this constructor?
}
//destructor
template <typename T>
Node<T>::~Node() {
delete left;
delete right;
//delete;
}
//print tree method
template <typename T>
void Node<T>::printTree() {
if (left != NULL) {
left->printTree();
cout << item << endl;//alphabetical order
}
if (right != NULL) {
right->printTree();
//cout << item << endl; //post order
}
}
//search Tree method
template <typename T>
bool Node<T>::searchTree(T key) {
bool found = false;
if (item == key) {
return true;
}
if (left != NULL) {
found = left->searchTree(key);
if (found) return true;
}
if (right != NULL) {
return right->searchTree(key);
}
return false; //if left and right are both null & key is not the search item, then not found == not in the tree.
}
#endif
Main.cpp Class:
#include "Node.h"
#include <iostream>
using namespace std;
//set up tree method
Node<string> *setUpTree() {
Node<string> *s_tree =
new Node<string>("Sunday",
new Node<string>("monday",
new Node<string>("Friday"),
new Node<string>("Saturday")),
new Node<string>("Tuesday",
new Node<string>("Thursday"),
new Node<string>("Wednesday")));
return s_tree;
}
int main() {
Node<string> *s_tree;
s_tree = setUpTree(); //call setUpTree method on s_tree
cout << "Part 2 :Printing tree values: " << endl;
s_tree->printTree(); //call print tree method
cout << endl;
//search for range of tree values
//searchTree(s_tree, "Sunday");
//searchTree(s_tree, "Monday");
return 0;
}
首先setupTree
中的return应该是s_tree
。
其次,您通过一次添加每个项目来构建二叉树。我建议让 setupTree
接受一组值,然后您可以一次取一个值并构建树。
正如所指出的,左和右的默认值应该是 NULL。但是,我只是在声明中这样做,这样您就不必在每个未指定值的构造函数中重复它:
private:
//private data member functions:
Node* left = NULL;
Node* right = NULL;
T item;
我不知道这是否是唯一的问题,但是...如果您构造一片叶子,则必须将 left
和 right
指针设置为 NULL
template <typename T>
Node<T>::Node(T i) : left(NULL), right(NULL), item(i)
{ }
否则调用析构函数时
template <typename T>
Node<T>::~Node() {
delete left;
delete right;
//delete;
}
delete
被未定义的值调用;两次。
这是崩溃的完美秘诀。
你使用 left
或 right
检查指针是否为 NULL
的每个点中的其他问题,如 printTree()
或 searchTree()
中所做的那样: value 是未定义的,所以可以是非 NULL
,通过测试并且 printTree()
是通过具有未定义值
-- 编辑--
建议的构造器。
template <typename T>
Node<T>::Node (T i, Node<T> * lft, Node<T> * rht)
: left(lft), right(right), item(i)
{ }
template <typename T>
Node<T>::Node (T i)
: left(NULL), right(NULL), item(i)
{ }
--- 编辑 2 ---
it is now printing some values at least ; monday sunday tuesday. not sure about the rest
看看你的printTree()
方法
模板 void Node::printTree() { 如果(左!= NULL){ 左->printTree(); cout << item << endl;//字母顺序 }
if (right != NULL) {
right->printTree();
//cout << item << endl; //post order
}
}
如果 left
不是 NULL
,它只打印值 (item
) 。所以它不打印叶子的值。
建议:修改 printTree()
打印 item
即使 left
是 NULL
.
举例
template <typename T>
void Node<T>::printTree() {
if (left != NULL) {
left->printTree();
}
cout << item << endl;
if (right != NULL) {
right->printTree();
}
}