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中给定的;
您必须执行以下操作:
o← 相反(t,e)
分配等级[o]=等级[t]+1t之后← Q.dequeue()
iflevel[t]>targeted\u level break代码>
o← 相反(t,e)
分配等级[o]=等级[t]+1t之后← Q.dequeue()
iflevel[t]>targeted\u level break代码>
需要切换第一和第二个子句,否则可能存在空指针解引用。首先访问左分支也更自然!需要切换第一和第二个子句,否则可能存在空指针解引用。首先访问左分支也更自然!