C++ C++;通过递归插入二叉搜索树

C++ C++;通过递归插入二叉搜索树,c++,insert,binary-tree,C++,Insert,Binary Tree,下面是我的代码。我没有收到任何错误,它将所有内容都放置在节点中。但是根据我的调试语句,每次插入任何东西都会找到根。我不确定这是否正确。但是根据作业的输出文件,当涉及到树的高度、遍历时,我的答案是不同的,而且我的叶数函数仍然有问题。另一个故事 根据调试语句,看起来一切都正常进行。但我想我可能需要一双新鲜的眼睛。我根本看不出我的遍历是如何改变的,因为这实际上只是一个我在哪里处理节点的问题,节点应该影响顺序、前顺序和后顺序 template <class T> void BT<T&g

下面是我的代码。我没有收到任何错误,它将所有内容都放置在节点中。但是根据我的调试语句,每次插入任何东西都会找到根。我不确定这是否正确。但是根据作业的输出文件,当涉及到树的高度、遍历时,我的答案是不同的,而且我的叶数函数仍然有问题。另一个故事

根据调试语句,看起来一切都正常进行。但我想我可能需要一双新鲜的眼睛。我根本看不出我的遍历是如何改变的,因为这实际上只是一个我在哪里处理节点的问题,节点应该影响顺序、前顺序和后顺序

template <class T>
void BT<T>::insert(const T& item)
 {
    Node<T>* newNode;
    newNode = new Node<T>(item);
    insert(root, newNode);
 }


template <class T>
void BT<T>::insert(struct Node<T> *&root, struct Node<T> *newNode)
 {
    if (root == NULL)
       {
          cout << "Root Found" << newNode->data << endl;
          root = newNode;
       }
    else
        {
           if (newNode->data < root->data)
              {
              insert(root->left, newNode);
              cout << "Inserting Left" << newNode-> data << endl;
              }
           else
               {
               insert(root->right, newNode);
               cout << "Inserting Right" << newNode->data << endl;
               }
        }
 }
模板
无效BT::插入(常数T和项目)
{
节点*新节点;
newNode=新节点(项目);
插入(根,新节点);
}
模板
void BT::insert(结构节点*&根,结构节点*新节点)
{
if(root==NULL)
{
cout(数据)
{
插入(根->左,新节点);
不能左)
返回1+高度(根->右);
返回1+高度(根->左);
}
}

您需要更改调试语句的措辞

实际上,它应该读取(而不是根节点)

cout right使其成为中间节点

要编写height(),我将执行以下操作:

template <class T>
int BT<T>::height(Node<T>* root) const
{
    if (root == NULL) {return 0;}

    return 1 + max(height(root->left),height(root->right));
}
模板
int BT::高度(节点*根)常数
{
如果(root==NULL){返回0;}
返回1+max(高度(根->左),高度(根->右);
}

您需要更改调试语句的措辞

实际上,它应该读取(而不是根节点)

cout right使其成为中间节点

要编写height(),我将执行以下操作:

template <class T>
int BT<T>::height(Node<T>* root) const
{
    if (root == NULL) {return 0;}

    return 1 + max(height(root->left),height(root->right));
}
模板
int BT::高度(节点*根)常数
{
如果(root==NULL){返回0;}
返回1+max(高度(根->左),高度(根->右);
}

首先,您需要将根init'd设置为null。此外,您正在传入*&node;它应该是*node。否则,您将传递指向地址的指针(或引用,我不确定在此上下文中是哪个,但两者都不正确)。您应该传入指向中节点的指针,而不是引用

template <class T>
void BT<T>::BT() 
{ root = 0;}

template <class T>
void BT<T>::insert(const T& item)
 {
    Node<T>* newNode;
    newNode = new Node<T>(item);
    insert(root, newNode);
 }

template <class T>
void BT<T>::insert(struct Node<T> *root, struct Node<T> *newNode)
{
 /*stuff*/
}
模板
void BT::BT()
{root=0;}
模板
无效BT::插入(常数T和项目)
{
节点*新节点;
newNode=新节点(项目);
插入(根,新节点);
}
模板
void BT::insert(结构节点*根,结构节点*新节点)
{
/*东西*/
}

首先,您需要将根init'd设置为null。此外,您正在传入*&node;它应该是*node。否则,您将传递指向地址的指针(或引用,我不确定在此上下文中是哪个,但两者都不正确)。您应该传入指向中节点的指针,而不是引用

template <class T>
void BT<T>::BT() 
{ root = 0;}

template <class T>
void BT<T>::insert(const T& item)
 {
    Node<T>* newNode;
    newNode = new Node<T>(item);
    insert(root, newNode);
 }

template <class T>
void BT<T>::insert(struct Node<T> *root, struct Node<T> *newNode)
{
 /*stuff*/
}
模板
void BT::BT()
{root=0;}
模板
无效BT::插入(常数T和项目)
{
节点*新节点;
newNode=新节点(项目);
插入(根,新节点);
}
模板
void BT::insert(结构节点*根,结构节点*新节点)
{
/*东西*/
}
@Vlion:
它应该是指向左/右/根指针的指针(即双指针),因此发布的代码是正确的,尽管有些不清楚

@道格:
考虑更改插入函数:

template <class T>
void BT<T>::insert(struct Node<T>** root, struct Node<T>* newNode)
 {
    if (*root == NULL)
       {
          cout << "Root Found" << newNode->data << endl;
          *root = newNode;
       }
也将反映您更改指针值的意图。不过,这是一个风格问题,因此如果您不想更改,我无法争辩


至于检查这棵树是否“正确”,为什么不把它画出来自己看看呢

template class<T>
void printTree(struct Node<T>* node, int level=0)
{
    if (!node) {
        for (int i=0; i<level; ++i)
            cout << "  ";
        cout << "NULL" << endl;

        return;
    }

    printTree(node->left, level+1);

    for (int i=0; i<level; ++i)
        cout << "  ";
    cout << node->data << endl;

    printTree(node->right, level+1);
}
模板类
无效打印树(结构节点*节点,int级别=0)
{
如果(!节点){
对于(inti=0;i@Vlion:
它应该是指向左/右/根指针的指针(即双指针),因此发布的代码是正确的,尽管有些不清楚

@道格:
考虑更改插入函数:

template <class T>
void BT<T>::insert(struct Node<T>** root, struct Node<T>* newNode)
 {
    if (*root == NULL)
       {
          cout << "Root Found" << newNode->data << endl;
          *root = newNode;
       }
也将反映您更改指针值的意图。不过,这是一个风格问题,因此如果您不想更改,我无法争辩


至于检查这棵树是否“正确”,为什么不把它画出来自己看看呢

template class<T>
void printTree(struct Node<T>* node, int level=0)
{
    if (!node) {
        for (int i=0; i<level; ++i)
            cout << "  ";
        cout << "NULL" << endl;

        return;
    }

    printTree(node->left, level+1);

    for (int i=0; i<level; ++i)
        cout << "  ";
    cout << node->data << endl;

    printTree(node->right, level+1);
}
模板类
无效打印树(结构节点*节点,int级别=0)
{
如果(!节点){

对于(int i=0;iso你认为我的插入是正确的吗?我的意思是根据我的调试打印…并实际记录下来…一切似乎都匹配。是的,你的身高给了我与我相同的值。它看起来更干净,效率更高,但我很感激。所以你认为我的插入是正确的吗?我的意思是根据我的调试打印…并实际记录你的身高给了我和我一样的价值。它看起来更干净,效率也更高,所以我很感激。不,他需要参考资料才能正确地完成作业。虽然它很难看,但我会给你的。不,他需要参考资料才能正确地完成作业。虽然它很难看,但我会我会给你的。谢谢你的帮助。所以我会试着像你说的那样改变它,但从技术上来说,我们的代码做的事情是一样的,对吧?我也忘了添加这一点,虽然我没有像你那样根据调试打印和我自己绘制的预定义硬编码数字绘制出树e插入..它似乎做得正确。我将它发送给我的助教,希望他能澄清。是的,他们都在做相同的事情;区别是表面上的。代码看起来正确,问题是(正如Martin York所指出的)打印“根发现”,而节点实际上只是新子树的根。(即叶子)谢谢你的帮助。所以我会试着像你说的那样改变它,但从技术上来说,我们的代码做的是相同的事情,对吗?我也忘了添加这一点,虽然我没有像你那样根据调试打印和我自己绘制的预定义硬拷贝绘制一个函数来绘制树