Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在二叉树的一个给定级别上打印所有元素_Algorithm_Binary Tree_Tree Traversal - Fatal编程技术网

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

Algorithm 在二叉树的一个给定级别上打印所有元素,algorithm,binary-tree,tree-traversal,Algorithm,Binary Tree,Tree Traversal,我需要打印(访问)二叉树的单个级别上的节点。 我不知道如何才能做到这一点,但总体而言,我对算法不是很熟练。 我知道在广度优先遍历中,您使用一个队列,首先将根节点放入队列中,然后将其出列访问它并将其子节点入列,然后将第一个被授权的子节点出列访问它并将其子节点入列,以此类推…… 根据我的理解,这使得不可能准确地知道一个级别何时结束,另一个级别何时开始,除非在创建二叉树时为每个节点分配级别,然后在进行广度优先遍历时检查级别 类似这样的内容(代码是PHP,但这不是一个与PHP相关的问题,而是一个与通用算

我需要打印(访问)二叉树的单个级别上的节点。
我不知道如何才能做到这一点,但总体而言,我对算法不是很熟练。
我知道在广度优先遍历中,您使用一个队列,首先将根节点放入队列中,然后将其出列访问它并将其子节点入列,然后将第一个被授权的子节点出列访问它并将其子节点入列,以此类推……
根据我的理解,这使得不可能准确地知道一个级别何时结束,另一个级别何时开始,除非在创建二叉树时为每个节点分配级别,然后在进行广度优先遍历时检查级别

类似这样的内容(代码是PHP,但这不是一个与PHP相关的问题,而是一个与通用算法相关的问题-这是一个函数的一部分,该函数将节点添加到二叉树中,在添加每个节点时存储节点中的级别):

if($this->root==null)
{
$this->root=$node;
$this->root->level=1;
返回;
}
$nextnode=$this->root;
$level=1;
while(true)
{
如果($node->value>$nextnode->value)
{
如果($nextnode->right!=null)
{
$nextnode=$nextnode->right;
$level++;
}
其他的
{
$nextnode->right=$node;
$nextnode->right->level=+$level;
返回;
}
}
else if($node->value<$nextnode->value)
{
如果($nextnode->left!=null)
{
$nextnode=$nextnode->left;
$level++;
}
其他的
{
$nextnode->left=$node;
$nextnode->left->level=+$level;
返回;
}
}
else if($node->value==$nextnode->value)
返回;
}
因此,我的问题是:

这是在二叉树的单个级别上打印节点的唯一方法吗?
还有别的办法吗?

在创建树时,是否有其他不存储级别的方法

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

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

这使得不可能确切地知道一个级别何时结束和结束 除非

在尝试执行的BFS遍历过程中,不需要遍历整个树。 您可以通过引入数组级别[]来修改wiki中给定的; 您必须执行以下操作:

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

  • 每当u在行中标记o时:
    o← 相反(t,e)
    分配等级[o]=等级[t]+1

  • t之后← Q.dequeue()
    if
    level[t]>targeted\u level break

  • @第

    这使得不可能确切地知道一个级别何时结束和结束 除非

    在尝试执行的BFS遍历过程中,不需要遍历整个树。 您可以通过引入数组级别[]来修改wiki中给定的; 您必须执行以下操作:

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

  • 每当u在行中标记o时:
    o← 相反(t,e)
    分配等级[o]=等级[t]+1

  • t之后← Q.dequeue()
    if
    level[t]>targeted\u level break


  • 需要切换第一和第二个子句,否则可能存在空指针解引用。首先访问左分支也更自然!需要切换第一和第二个子句,否则可能存在空指针解引用。首先访问左分支也更自然!