打印二叉树的单个给定级别上的所有元素

时间:2010-01-23 08:07:05

标签: algorithm binary-tree tree-traversal

我需要在二叉树的单个级别上打印(访问)节点 我不知道如何做到这一点但是我一般都不熟悉算法 我知道在广度优先遍历你使用一个队列,然后你开始将根节点放入队列然后你出列它访问它并将它的孩子排队然后你出列第一个被邀请的孩子访问它并将它排队等孩子等等上...
根据我的理解,这使得无法确切知道何时一个级别结束而另一个级别开始,除非您在创建二叉树时为每个节点分配它的级别,然后在执行广度优先遍历时检查级别。

这样的东西(代码在PHP中,但这不是PHP相关的问题,它是一个与算法相关的通用问题 - 这是一个函数的一部分,它将一个节点添加到存储节点中的级别的二叉树中节点已添加):

if($this->root == null)
    {
        $this->root = $node;
                    $this->root->level = 1;
        return;
    }

    $nextnode = $this->root;

            $level = 1;

    while (true)
    {
        if($node->value > $nextnode->value)
        {
                        if($nextnode->right != null)
                        {
                            $nextnode = $nextnode->right;
                            $level++;
                        }
                        else
                        {
                            $nextnode->right = $node;
                            $nextnode->right->level = ++$level;
                            return;
                        }
        }
        else if($node->value < $nextnode->value) 
        {
                        if($nextnode->left != null)
                        {
                            $nextnode = $nextnode->left;
                            $level++;
                        }
                        else
                        {
                            $nextnode->left = $node;
                            $nextnode->left->level = ++$level;
                            return;
                        }
        }
        else if($node->value == $nextnode->value)
            return;
    }

所以我的问题是:

这是在二叉树的单个级别上打印节点的唯一方法吗? 有另一种方式吗?
在创建树时没有存储级别的另一种方法吗?

2 个答案:

答案 0 :(得分:3)

递归解决方案套件会吗? 我在C中写道,我希望这对你来说不是问题。

void traverse_tree_rec(TreeNode *ptn, int current_level, int targeted_level, (void*)(pVisit)(TreeElement*)){    
    if (ptn==NULL)
        return;
    else if(current_level == targeted_level)
        pVisit(ptn->entry);
    else{
        traverse_tree_rec(ptn->left, current_level+1, targeted_level, pVisit);
        traverse_tree_rec(ptn->right, current_level+1, targeted_level, pVisit);
    }
}

void traverse_level(Tree *pTree, int level, (void*)(pFunction)(TreeElement)){
    traverse_level_rec(pTree->root, 0, level, pFunction);
}

答案 1 :(得分:0)

@Para,

  

这使得无法准确知道一个级别何时结束   另一个开始,除非......

在您尝试执行的 BFS遍历期间,您无需遍历整个树。 您可以通过引入数组级别[]来修改wiki中给出的BFS psedocode; 你必须这样做:

  1. 将每个节点的级别初始化为0.

  2. 每当你在一行中标记o:o ← G.opposite(t,e)指定等级[o] =等级[t] +1;

  3. {li>

    t ← Q.dequeue()level[t] > targeted_level break;