C++ 二叉搜索树的实现

C++ 二叉搜索树的实现,c++,data-structures,binary-tree,C++,Data Structures,Binary Tree,我搜索了论坛,并尝试在我找到的线程中实现代码。但我从上午10点开始就在做这个简单的程序,无法解决seg问题。为了我的生命 任何关于我做错了什么的想法都将不胜感激 BST.h(所有的实现问题都应该在这里,并且已经更新了一些以反映进一步的开发工作,查看历史以查看旧版本。) \ifndef BST\u H_ #定义BST_H_ #包括 #包括 #包括“btnode.h” 使用名称空间std; /* 表示模板化二叉搜索树的类。 */ 样板 BST级 { 私人: //指向树中根节点的指针 BTNode*根

我搜索了论坛,并尝试在我找到的线程中实现代码。但我从上午10点开始就在做这个简单的程序,无法解决seg问题。为了我的生命

任何关于我做错了什么的想法都将不胜感激

BST.h(所有的实现问题都应该在这里,并且已经更新了一些以反映进一步的开发工作,查看历史以查看旧版本。)

\ifndef BST\u H_
#定义BST_H_
#包括
#包括
#包括“btnode.h”
使用名称空间std;
/*
表示模板化二叉搜索树的类。
*/
样板
BST级
{
私人:
//指向树中根节点的指针
BTNode*根;
公众:
//生成空树的默认构造函数
BST();
/*
您必须记录这4个函数
*/
空白插入(T值);
布尔搜索(常量T和值)常量;
布尔搜索(BTNode*节点,常量T和值)常量;
void printInOrder()常量;
无效清除(常数T和值);
//函数打印出视觉表示
//树的属性(不只是打印树的值
//(在一行上)
无效打印()常量;
私人:
//“print()的递归辅助函数
无效打印(BTNode*node,int-depth)常量;
};
/*
生成空树的默认构造函数
*/
样板
BST::BST()
{
root=NULL;
}
样板
无效BST::插入(T值)
{
BTNode*newNode=新BTNode(值);
cout数据;
if(root==NULL)
{
根=新节点;
回来
}
BTNode*current=root;
while(true)
{
如果(当前->左==NULL&当前->右==NULL)
打破
如果(当前->右!=NULL&¤t->左!=NULL)
{
如果(新建节点->数据>当前->数据)
当前=当前->右侧;
else if(新节点->数据<当前->数据)
当前=当前->左侧;
}
如果(当前->右侧!=NULL&¤t->left==NULL),则为else
{
如果(新建节点->数据<当前->数据)
打破
else if(新节点->数据->当前->数据)
当前=当前->右侧;
}
else if(当前->右==NULL&¤t->left!=NULL)
{
如果(新建节点->数据>当前->数据)
打破
else if(新节点->数据<当前->数据)
当前=当前->左侧;
}
}
如果(当前->数据>新节点->数据)
{   
当前->左=新节点;

/*cout data因为这是家庭作业,我将帮助您自助。您应该做的第一件事是编写一个
dump
函数,它以可读的形式吐出树,为每个节点显示:

  • 当前节点的地址
  • 当前节点的值
  • 左节点指针的地址
  • 右节点指针的地址

然后在每次插入和删除后调用
dump
函数。这是标准的调试101,如果您愿意,您可以保留该代码。如果您向您的教育者展示您编写单元测试代码的聪明才智,那么您可能会从他们那里获得更多分数。

既然这是家庭作业,我将帮助您自助。首先你应该做的是编写一个
dump
函数,它以可读的形式吐出树,为每个节点显示:

  • 当前节点的地址
  • 当前节点的值
  • 左节点指针的地址
  • 右节点指针的地址

然后在每次插入和删除后调用
dump
函数。这是标准的调试101,如果您愿意,您可以保留该代码。如果您向您的教育者展示您有编写单元测试代码的智慧,它可能会从他们那里获得更多分数。

insert
有内存泄漏。以下三行:

BTNode<T>* current = new BTNode<T>(NULL);
current = root;
current->data = root->data;

insert
内存泄漏。以下三行:

BTNode<T>* current = new BTNode<T>(NULL);
current = root;
current->data = root->data;

您在哪里遇到分段错误?您是否尝试运行附加到调试器以便获得堆栈跟踪?我在删除函数中得到了它。但我不确定是因为删除函数错误,还是因为删除函数中显示的插入函数出错。您在哪里遇到分段初始化错误?您是否尝试运行附加到调试器以便获得堆栈跟踪?我在remove函数中得到了它。但我不确定这是因为remove函数错误,还是因为remove函数中显示的insert函数出错。@paxdiablo:由于OP使用的是模板,他被迫将imple“没有问题,@Billy,我会把它去掉的。@paxdiablo:因为OP使用的是模板,他被迫把实现放到头文件中。没有问题,@Billy,我会把它去掉的。我现在正在研究这些技巧。但是,就我所知,前三行与应该是的一行有何不同?@G”abe,前三行创建一个初始化为0的新节点,然后立即忘记该节点(指向该节点的指针被指定为指向根节点,忘记的也是泄漏的发生方式)然后将根节点的数据成员中已有的数据分配给根节点的数据成员,因为current和root指向同一个对象。替换它们的线只是将当前点分配给root的点,并将其保留。好的,我明白了(谢谢);现在,如何修复remove函数中的当前/父节点?我正在研究这些技巧。但是,据我所知,前三行与它们应该是的一行有何不同?@Gabe,前三行创建一个初始化为0的新节点,然后立即忘记该节点(指向它的指针被指定为指向根节点,忘记泄漏是如何发生的),然后指定
#ifndef BTNODE_H_
#define BTNODE_H_

#include <iostream>

/*
    A class to represent a node in a
    binary search tree.
*/
template <typename T>

    class BTNode
    {
        public:

            //constructor
            BTNode(T d);

            //the node's data value
            T data;

            //pointer to the node's left child
            BTNode<T>* left;

            //pointer to the node's right child
            BTNode<T>* right;
    };

    /*
        Simple constructor.  Sets the data
        value of the BTNode to "d" and defaults its
        left and right child pointers to NULL.
    */
    template <typename T>
    BTNode<T>::BTNode(T d)
    : left(NULL), right(NULL)
    {
        data = d;
    }

    #endif
BTNode<T>* current = new BTNode<T>(NULL);
current = root;
current->data = root->data;
BTNode<T>* current = root;
BTNode<T>* current;
BTNode<T>* parent;
current = root;
parent->left = NULL;
parent->right = NULL;