【问题标题】:Traversal pointer in tree while insertion插入时树中的遍历指针
【发布时间】:2018-11-05 09:28:20
【问题描述】:
#include<iostream>

using namespace std;

struct node
{
    int data;
    node *right;
    node *left;
} ;

node *root = NULL;
node *right = NULL;
node *left = NULL;

node insert(int data)
{
    node *ptr = new node;
    ptr->data = data;
    ptr->left = NULL;
    ptr->right = NULL;

    if(root==NULL)
    {
        root = ptr;
        cout<<"Inserted "<<root->data<<" at root\n";
    }
    else
    {
        node *pos = root;
        while(pos)
        {
            cout<<pos->data<<" pos->data\n";
            if(pos->data > data)
            {
                cout<<pos->data<<": data\n";
                pos = pos->left;
            }
            else if(pos->data < data)
            {
                cout<<pos->data<<": data\n";
                pos = pos->right;
            }
            if(!pos)
                cout<<"NULL\n";
        }
        pos = ptr;
        cout<<"Inserted\n";
    }
    return *root;
}

void preorder(node *root)
{
    if(root)
    {
        cout<<root->data;
        preorder(root->left);
        preorder(root->right);
    }
}

int main()
{
    insert(2);
    insert(1);
    insert(3);
    insert(4);
    insert(5);
    preorder(root);
    return 0;
}

在这里,在插入新元素时,我将root 指向新变量pos,这样根就不会改变,因此它会正确地成为函数preorder() 的参数,因为它是实际的根

但是,pos 没有插入所有元素,也没有显示所需的结果。简而言之,我必须使用 root 而不是 pos 来插入,但直接使用 root 会改变“实际”根(在本例中为 2)。

【问题讨论】:

  • 如果您需要 C++ 程序方面的帮助,请不要将 C 和 C++ 标记放在同一个问题上。
  • 不要使用全局变量,它们很容易出错,使用范围变量几乎总是更好。
  • 另外,您的实际问题是什么?!
  • 好的!!明白了:D
  • 只是变量 pos 没有给出所需的结果。它没有遍历节点。它只是一次又一次地显示根目录。用 root 替换 pos 给出了解决方案,但是 root 指针被改变了。

标签: c++ data-structures tree binary-tree


【解决方案1】:

但是,pos 没有插入所有元素,也没有显示所需的结果。

我认为主要有两个错误。

  • root 永远不会在当前的 insert 函数中更新,因为 ptr 只是在 while 循环完成后才分配给一个临时变量 pos

  • 我们应该考虑传递参数data的值已经保存在二叉树中的情况。

此外,preorder 一次又一次地显示root 令人困惑。 修复insertpreorder 的示例如下。 DEMO is here.

node insert(int data)
{
    node *ptr = new node;
    ptr->data = data;
    ptr->left = nullptr;
    ptr->right = nullptr;

    if(!root)
    {
        root = ptr;
    }
    else
    {
        node *pos = root;

        while(true)
        {
            if(pos->data > data)
            {
                if(!pos->left){
                    pos->left = ptr;
                    break;
                }

                pos = pos->left;
            }
            else if(pos->data < data)
            {
                if(!pos->right){
                    pos->right = ptr;
                    break;
                }

                pos = pos->right;                
            }
            else{
                break;
            }
        }
    }
    return *root;
}

void preorder(node *next)
{
    if(next)
    {
        cout << next->data << std::endl;
        preorder(next->left);
        preorder(next->right);
    }
}

【讨论】:

  • 是的!明白了逻辑。谢谢:D
猜你喜欢
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-18
  • 2013-02-27
  • 1970-01-01
相关资源
最近更新 更多