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)
 {
    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;
               }
        }
 }

我的高度函数如下,以防我的插入实际上很好。

template <class T>
int BT<T>::height() const
{
   return height(root);
}


  template <class T>
  int BT<T>::height(Node<T>* root) const
   {
   if (root == NULL)
      return 0;
   else 
      {
      if (height(root->right) > height(root->left))
         return 1 + height(root-> right);
      return 1 + height(root->left);
      }
   }
4

3 回答 3

5

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

真的应该读(不是根节点)

 cout << "Leaf Node Found" << newNode->data << endl;

只有当它第一次被调用时它才是根节点,之后任何使用 node->left 或 node->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));
}
于 2008-10-16T05:10:58.820 回答
0

您需要从您的根初始化为 null 开始。此外,您正在传递 *&node in; 它应该是*节点。否则,您将传递一个指向地址的指针(或引用,我不确定在这种情况下哪个,但两者都不会正确)。您应该传递指向 Node in 的指针,而不是引用。

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*/
}
于 2008-10-16T06:18:20.057 回答
0

@Vlion:
它应该是指向左/右/根指针的指针(即双指针),因此发布的代码是正确的,尽管有些不清楚。

@Doug:
考虑更改您的插入功能:

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

它清楚地表明您将更改作为第一个参数传递的指针(或者更确切地说,其地址将作为第一个参数传递的指针)的意图。这将有助于避免诸如刚刚发生的混淆。

对此 insert() 的调用,例如:

insert(&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);
}

(未经测试的代码)

于 2008-10-16T06:51:00.537 回答