【问题标题】:C++ How to store the nodes of an in order traversal into an array?C ++如何将顺序遍历的节点存储到数组中?
【发布时间】:2020-09-03 08:51:32
【问题描述】:

我有一个像这样的有序遍历函数


void Inorder(node *root)
{
    node* array;
    array = new node[arraySize];


    if (root == NULL)
        return;
    Inorder(root->left); //visit left sub-tree
    

    std::cout << "Word: " << root->key << std::endl
              << "Occurance: " << root->count << std::endl; //print root key and its count

    Inorder(root->right); //visit right sub-tree
    
}

为了进一步对其进行排序,我需要将节点横向存储在一个数组中,但是我不确定我是否能做到这一点。视觉上我想要这样的东西

node array[0] = transversedNode; 

我尝试将 root 添加到数组中 当 Inorder 是节点类型时,我尝试将 Inorder(root->left) 添加到数组中

但是这些都不能满足我的需要。是否可以将横向节点存储到数组中?谢谢你

【问题讨论】:

  • 您可以使用 std::vector 和 push_back 元素,就像打印它们一样。您可以通过引用将此向量作为第二个参数传递,并沿递归传递。
  • 您需要有带数组的单个变量,或者更好的向量,才能将元素放入其中。这可以通过多种方式实现:将其作为函数参数,如果这是类中的函数,则作为类成员,作为静态变量。
  • @Unlikus 向量类型是什么?因为 key 是 string 而 count 是 int
  • @DickChang 向量类型应该是std::vector&lt;Node*&gt;

标签: c++ arrays inorder


【解决方案1】:

正如其他人已经评论的那样,您可以将数组声明替换为 std::vector&lt;Node*&gt; 并返回:

void InorderRecursive(Node *root, std::vector<Node*>& nodes)
{
    if (root == NULL)
        return;

    InorderRecursive(root->left, nodes); //visit left sub-tree

    std::cout << "Word: " << root->key << std::endl
              << "Occurance: " << root->count << std::endl; //print root key and its count
    nodes.push_back(root);

    InorderRecursive(root->right, nodes); //visit right sub-tree
}

std::vector<Node*> Inorder(Node *root)
{
    std::vector<Node*> nodes;    
    InorderRecursive(root, nodes);
    return nodes;
}

我添加了一个附加函数InorderRecursive,它调用自身并由Inorder 调用。它具有std::vector&lt;Node*&gt; 引用作为附加参数。原始向量在Inorder 中构造并通过。这样你就有了一个容器,避免复制整个东西。

【讨论】:

  • 你应该在遍历左子树之后执行 push_back(root),而不是之前,除非它是前序遍历。
  • 每次调用都会创建一个新向量,该向量从堆中分配给 push_back,当它返回时,复制到当前向量中。将相同的向量传递给递归调用会更有效,并且它们都直接将值添加到它而无需所有复制和分配。剩下的只是最初的调用:编写第二个非递归函数,它只获取根指针,声明向量并将它们传递给递归函数,返回向量。 (如果减少分配很重要。)
猜你喜欢
  • 1970-01-01
  • 2012-12-02
  • 2021-12-17
  • 2020-07-16
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
相关资源
最近更新 更多