【问题标题】:Program to set up a binary tree, print it & search - Node Class C++设置二叉树、打印和搜索的程序 - 节点类 C++
【发布时间】:2017-04-30 01:58:30
【问题描述】:

我创建了一个包含类节点的程序,用于表示任何类型的二叉树(模板)。

在我的 Node.h 类中,我有两个构造函数,但是我不确定我是否正确实现了它们。在构造函数中初始化值让我感到困惑。在我的 main.cpp 文件中,我有一个 setUpTree 函数。我的程序现在执行,但不打印设置的树。

我已经尝试了几个小时试图解决这个问题,但没有结束。我还没有真正体验过 C++、指针、构造函数等。

如果有人能帮我修复我的代码以便 setUpTree 函数和 printTree 方法正常工作,我将不胜感激。

谢谢

Node.h 类:

   #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 类:

#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;
}

【问题讨论】:

    标签: c++ templates constructor binary-tree nodes


    【解决方案1】:

    首先setupTree 中的返回应该是s_tree

    其次,您通过一次添加每个项目来构造一棵二叉树。我建议让setupTree 接受一组值,然后您可以一次取一个并构建树。

    正如所指出的,left 和 right 的默认值应该是 NULL。但是,我只会在声明中这样做,这样您就不必在每个未指定值的构造函数中重复它:

    private:
        //private data member functions:
        Node* left = NULL;
        Node* right = NULL;
        T item;
    

    【讨论】:

    • 谢谢,愚蠢的错误。我的 Node.h 类中的构造函数是否正确?并且也不确定 setUpTree 方法中的括号是什么,讲师只展示了几秒钟的幻灯片,所以不太确定它们是否正确
    • 除了 max66 指出的,使用 NULL 作为子节点的默认值之外,它们对我来说似乎没问题。
    • 我认为讲师可能正在向您展示他/她希望如何组织数据。您必须重新编写代码以获取一组值并一次遍历它们并将它们添加到树中。
    【解决方案2】:

    我不知道这是否是唯一的问题但是......如果你构造一个叶子,你必须将leftright指针设置为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 被未定义的值调用;两次。

    这是一个完美的崩溃秘诀。

    您使用leftright 的每个点的其他问题检查指针是否为NULL,如printTree()searchTree() 中所做的:该值未定义,因此可以是非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 ---

    它现在至少打印一些值;周一周日周二。其他的不清楚

    看看你的printTree()方法

    模板 无效节点::printTree() { 如果(左!= NULL){ 左->printTree(); cout

    if (right != NULL) {
        right->printTree();
        //cout << item << endl; //post order
    }
    

    }

    它打印值(item如果left 不是NULL。所以它不会打印叶子的值。

    建议:修改printTree()以打印item,即使leftNULL

    举例

    template <typename T>
    void Node<T>::printTree() {
        if (left != NULL) {
            left->printTree();
        }
    
        cout << item << endl;
    
        if (right != NULL) {
            right->printTree();
        }
    }
    

    【讨论】:

    • 我更改了代码,因此构造函数现在将它们设置为 NULL template Node::Node(T i, Node *lft, Node * rht) { 项目 = i;左=空;对=空; } 这就是你的意思吗?
    • @Liam - 是的;我建议 inzialize 初始化列表中的值(抱歉:忘记了 :;现在更正)但您的更正应该足够了。
    • 程序现在执行没有崩溃但不打印任何值
    • @Liam - 抱歉,我现在才看到:您更改了错误的构造函数;接收lftrht 的构造函数是对的;在构造函数中接收一个T,你必须强加left = right = NULL
    • @Liam - 改进了打印叶节点的答案;关于构造函数的区别,搜索“初始化列表”;看看,例如,this question 和第一个答案
    猜你喜欢
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多