【问题标题】:How to print binary tree in horizontal way?如何以水平方式打印二叉树?
【发布时间】:2020-02-28 09:56:36
【问题描述】:

如何以这种方式打印我的二叉树?

the original tree      I need 
      5                5
     /  \              
    2    9             2   9
   / \  / \   
  0  3  7  12          0 3 7 12

我的打印功能是:

void display(struct node* start){
    cout << start->data << " ";
   if(start != NULL){
        if(start->left){
            cout << "\n";
           display(start->left);
    }
        if(start->right) {
            display(start->right);
        }
    }
}

目前我的函数以这种方式打印

5
2 
0 3 9
7 12

【问题讨论】:

  • 树总是完整的还是缺少分支?
  • 您需要对树进行级别顺序遍历(或 BFS)。你正在做的是DFS。您应该使用队列进行遍历而不是递归。
  • @Botje 树已完成

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


【解决方案1】:

您可以创建一个哈希映射来指示您所在的树的级别与树的该级别的值相关联。例如:

std::map<unsigned, std::vector<unsigned>> hash;

然后您可以遍历您的树并填充您的地图,以便您的地图如下所示:

hash[0] = { 5 };
hash[1] = { 2, 9 };
hash[2] = { 0, 3, 7, 12 };

您可能需要使用临时计数器变量来了解您在树中的深度级别并相应地更新它。使用该临时索引计数器来指示映射的键,并使用它来填充树的行,将值保存到向量中,然后从那里,您可以在每个键级别打印此映射...

for (unsigned i = 0; i < hash.size(); i++ ) { // each level of tree
    for (auto& v : hash[i] ) { // each element in that vector
        std::cout << v << " ";
    }
    std::cout << '\n';
}

这样的事情可能是一种可能的解决方案......

【讨论】:

    【解决方案2】:

    问题是您不能“向后”打印。一旦你打印了一行,你就无法返回(使用标准 C++,可能会使用终端控制代码或函数,这会使你的代码过于复杂)。

    请考虑使用“矩阵”缓冲区,其中树的每一“行”都存储在“二维”数组的单行中。

    对于像你这样的树,缓冲区可能类似于

    int buffer[3][4];
    

    那么buffer[0][0] 将是树的根,buffer[1][0] 将是2 节点,buffer[1][1] 将是9 节点,buffer[2] 将包含所有叶节点。

    然后要打印,您只需遍历“缓冲区”并将所有节点均匀隔开(需要实验)。

    这需要您知道(或具有让您学习的功能)树的深度以及叶节点的数量。不过,对于纯二叉树,很容易找到它。

    【讨论】:

      【解决方案3】:

      std::vector&lt;node*&gt; frontier = { root_node }开头

      然后,重复以下操作:

      • frontier 中的每个元素打印node-&gt;value,并排在一行上。
      • 再次遍历frontier 并将所有node-&gt;leftnode-&gt;right 指针收集到一个新向量中。将此分配给frontier
      • 如果任何子指针为 NULL,则停止。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-16
        • 2019-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多