使用二叉搜索树 C++ 进行广度优先遍历

Con*_*nor 3 c++ breadth-first-search binary-search-tree

也许快速/简单的问题。我已经实现了二叉树,然后我希望将二叉搜索树转换为数组,或者至少将其打印出来,就像在数组中一样。我遇到问题的地方是如何在“\0”中获取 NULL/标志。

例如,假设我有一棵树,如:

                10
               /  \
              6   12
             / \   \
            1  8   15
             \
              4   
Run Code Online (Sandbox Code Playgroud)

我希望它打印它应该如何打印。喜欢:

        [10,6,12,1,8,\0,15,\0,4,\0,\0,\0,\0,\0,\0]
        ^Something Like this^ I don't know if I counted the NULL correctly.
Run Code Online (Sandbox Code Playgroud)

或者关于我想如何在视觉上显示我的树的另一个选项是如何正确输出间距,就像'/'和'\'指向父母的键一样:

                10
               /  \
              6   12
             / \   \
            1  8   15
             \
              4   
Run Code Online (Sandbox Code Playgroud)

这是我尝试在代码方面详细阐述的内容,但我卡住了:

void BreadthFirstTravseral(struct node* root)
{
    queue<node*> q;

    if (!root) {
        return;
    }
    for (q.push(root); !q.empty(); q.pop()) {
        const node * const temp_node = q.front();
        cout<<temp_node->data << " ";

        if (temp_node->left) {
            q.push(temp_node->left);
        }
        if (temp_node->right) {
            q.push(temp_node->right);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

非常感谢任何类型的帮助或链接和/或建议和/或示例代码。

izo*_*ica 6

很难正确获得间距,因为一个键可能有多个数字,这应该会影响给定节点上方所有级别的间距。

至于如何添加NULL- 只需为您打印 NULL 的 ifs 添加 else 子句:

if (root) {
  q.push(root);
  cout << root->data << " ";  
} else {
  cout << "NULL ";
}
while (!q.empty()) {
    const node * const temp_node = q.front(); 
    q.pop();

    if (temp_node->left) {
      q.push(temp_node->left);
      cout << temp_node->left->data << " ";
    } else {
      cout << "NULL ";
    }


    if (temp_node->right) {
      q.push(temp_node->right);
      cout << temp_node->right->data << " ";
    } else {
      cout << "NULL ";
    }
}
Run Code Online (Sandbox Code Playgroud)

  • While 循环不会永远持续下去,因为没有从 q 中弹出任何内容吗?无限循环是我的计算机系统正在实现的。 (2认同)