级别顺序遍历二叉树

bre*_*ett 8 c++ algorithm binary-tree breadth-first-search tree-traversal

void traverse(Node* root)
{
    queue<Node*> q;

    Node* temp_node= root;

    while(temp_node)
    {
        cout<<temp_node->value<<endl;

        if(temp_node->left)
            q.push(temp_node->left);

        if(temp_node->right)
            q.push(temp_node->right);

        if(!q.empty())
        {
            temp_node = q.front();
            q.pop();
        }
        else
            temp_node = NULL;
   }
 }
Run Code Online (Sandbox Code Playgroud)

上面发布的代码是我的级别订单遍历代码.这段代码对我来说很好,但我不喜欢的一件事是我明确初始化temp_node = NULL或者使用break.但它对我来说似乎不是一个好的代码.

是否有比这更好的实现或如何使这个代码更好?

Omn*_*ous 13

void traverse(Node* root)
{
    queue<Node*> q;

    if (root) {
        q.push(root);
    }
    while (!q.empty())
    {
        const Node * const temp_node = q.front();
        q.pop();
        cout<<temp_node->value<<"\n";

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

在那里,没有更特殊的情况.并且压痕被清理干净,因此可以更容易理解.

或者:

void traverse(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->value<<"\n";

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

完成for循环.就个人而言,我喜欢额外的变量.变量名比一直说'q.front()`更简单.