【问题标题】:Print all the elements on a single given level of a binary tree在二叉树的单个给定级别上打印所有元素
【发布时间】:2010-01-23 08:07:05
【问题描述】:

我需要打印出(访问)二叉树单层上的节点。
我不明白如何做到这一点,但我又不是很擅长一般的算法。
我知道在广度优先遍历中,您使用队列,并且首先将根节点放入队列中,然后将其出列访问它并将其子项入队,然后将第一个入队的子项出列访问它并将其子项入队等等在...
根据我的理解,除非您在创建二叉树时为每个节点分配其级别,然后在进行广度优先遍历时检查该级别,否则无法准确知道一个级别何时结束而另一个级别何时开始。

类似这样的东西(代码在 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;
    }

所以我的问题是:

这是在二叉树的单层上打印节点的唯一方法吗?
还有其他方法吗?
在创建树时是否有另一种不存储关卡的方法?

【问题讨论】:

    标签: algorithm binary-tree tree-traversal


    【解决方案1】:

    递归解决方案适合您吗? 我是用 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);
    }
    

    【讨论】:

    • 需要切换第一和第二子句,否则可能存在空指针取消引用。先访问左分支也更自然!
    【解决方案2】:

    @帕拉,

    这使得无法准确知道一个关卡何时结束以及 另一个开始,除非 ....

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

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

    2. 每当你在行中标记 o 时:o ← G.opposite(t,e)assign level[o] = level[t]+1;

    3. t ← Q.dequeue()之后如果level[t] &gt; targeted_level break;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-26
      • 1970-01-01
      相关资源
      最近更新 更多