Java 通用树的级别顺序树遍历,逐级显示树
我想逐级显示树结构。我当前的代码执行BFS或级别顺序遍历,但我无法让输出像树一样显示树结构 请参阅当前输出和预期输出 我的想法是使用某种计数来迭代队列中同一级别的元素 我怎么能这样做呢 如果有人需要整个实现,可以在下面的链接中找到没有此函数的原始代码。其他人只需查看下面的displayBFS函数 谢谢Java 通用树的级别顺序树遍历,逐级显示树,java,algorithm,tree,tree-traversal,directed-acyclic-graphs,Java,Algorithm,Tree,Tree Traversal,Directed Acyclic Graphs,我想逐级显示树结构。我当前的代码执行BFS或级别顺序遍历,但我无法让输出像树一样显示树结构 请参阅当前输出和预期输出 我的想法是使用某种计数来迭代队列中同一级别的元素 我怎么能这样做呢 如果有人需要整个实现,可以在下面的链接中找到没有此函数的原始代码。其他人只需查看下面的displayBFS函数 谢谢 void displayBFS(NaryTreeNode n) { Queue<NaryTreeNode> q = new LinkedList<Na
void displayBFS(NaryTreeNode n)
{
Queue<NaryTreeNode> q = new LinkedList<NaryTreeNode>();
System.out.println(n.data);
while(n!=null)
{
for(NaryTreeNode x:n.nary_list)
{
q.add(x);
System.out.print(x.data + " ");
}
n=q.poll();
System.out.println();
}
}
Current Tree Structure for reference:
root(100)
/ | \
90 50 70
/ \
20 30 200 300
Current Output:
100
90 50 70
20 30
200 300
Expected Output
100
90 50 70
20 30 200 300
void displayBFS(奈米绿节点n)
{
队列q=新的LinkedList();
系统输出打印项次(n.数据);
while(n!=null)
{
用于(NaryTreeNode x:n.nary_列表)
{
q、 加(x);
系统输出打印(x.data+“”);
}
n=q.poll();
System.out.println();
}
}
当前树结构供参考:
根(100)
/ | \
90 50 70
/ \
20 30 200 300
电流输出:
100
90 50 70
20 30
200 300
预期产量
100
90 50 70
20 30 200 300
另外,我之前发布了一个具有相同功能的逻辑问题,因为已经回答了这个问题,并且当前问题与另一个问题相关,我发布了一个新问题,这种方法可以吗,或者我应该编辑先前的问题而不打开新问题?使用另一个队列来指示深度。 下面的代码未经测试,但它应该能让您了解这一点(引入sep变量是为了避免尾随空格):
void displayBFS(奈米绿节点n){
队列q=新的LinkedList();
队列深度=新建LinkedList();
q、 添加(n);
深度。添加(0);
字符串sep=“”;
int oldDepth=0
而(!q.isEmpty()){
NaryTreeNode currN=q.poll();
int currDepth=depth.poll();
如果(currDepth>oldDepth){
System.out.println();
oldDepth=当前深度;
sep=“”;
}
系统输出打印(九月+当前数据);
sep=“”;
对于(NaryTreeNode x:当前列表){
q、 加(x);
深度。添加(currDepth+1);
}
}
}
就我的口味而言,与其他方法相比,这种方法更容易解释。只需跟踪当前级别和下一级别
static void displayBFS(NaryTreeNode root) {
int curlevel = 1;
int nextlevel = 0;
LinkedList<NaryTreeNode> queue = new LinkedList<NaryTreeNode>();
queue.add(root);
while(!queue.isEmpty()) {
NaryTreeNode node = queue.remove(0);
if (curlevel == 0) {
System.out.println();
curlevel = nextlevel;
nextlevel = 0;
}
for(NaryTreeNode n : node.nary_list) {
queue.addLast(n);
nextlevel++;
}
curlevel--;
System.out.print(node.data + " ");
}
}
静态void displayBFS(narytreenoderoot){
int curlevel=1;
int nextlevel=0;
LinkedList队列=新建LinkedList();
添加(根);
而(!queue.isEmpty()){
NaryTreeNode节点=queue.remove(0);
if(curlevel==0){
System.out.println();
curlevel=nextlevel;
nextlevel=0;
}
for(narytreenoden:node.nary_列表){
queue.addLast(n);
nextlevel++;
}
卷发--;
System.out.print(node.data+“”);
}
}
切换级别时,将nextlevel替换为currentlevel并重置nextlevel。我更喜欢这样简单,而不是保持一个完整的单独队列
上周我在接受微软的采访时问了这个问题。。。我在电话里感觉不太好。很感谢你研究它。我想我们还需要三个变量。numInCurrentLevel用于跟踪当前级别中的元素数量,indexInCurrentLevel用于在当前级别中遍历时进行计数,NumInExtLevel用于跟踪下一级别中的元素数量。代码如下:
static void displayBFS(NaryTreeNode root) {
Queue<NaryTreeNode> q = new LinkedList<NaryTreeNode>();;
q.add(root);
int numInCurrentLevel = 1;
int numInNextLevel = 0;
int indexInCurrentLevel=0;
while(!q.isEmpty()) {
NaryTreeNode node = q.poll();
System.out.print(node.data + " ");
indexInCurrentLevel++;
for(NaryTreeNode n : node.nary_list) {
q.add(n);
numInNextLevel++;
}
//finish traversal in current level
if(indexInCurrentLevel==numInCurrentLevel) {
System.out.println();
numInCurrentLevel=numInNextLevel;
numInNextLevel=0;
indexInCurrentLevel=0;
}
}
}
静态void displayBFS(narytreenoderoot){
队列q=新的LinkedList();;
q、 添加(根);
int numInCurrentLevel=1;
int numnextlevel=0;
int indexInCurrentLevel=0;
而(!q.isEmpty()){
NaryTreeNode节点=q.poll();
System.out.print(node.data+“”);
indexInCurrentLevel++;
for(narytreenoden:node.nary_列表){
q、 添加(n);
numInNextLevel++;
}
//在当前级别中完成遍历
if(indexInCurrentLevel==numInCurrentLevel){
System.out.println();
numInCurrentLevel=numInNextLevel;
numInNextLevel=0;
indexInCurrentLevel=0;
}
}
}
希望能有所帮助,我对java编程不太熟悉。我所知道的解决这个问题的最简单方法是使用sentinel。使用根节点和sentinel初始化队列,然后在队列中循环:
- 我们在一个级别的末尾,所以我们可以结束输出行
- 如果队列不是空的,则将哨兵推回到末尾的队列上李>
- 打印出来
- 将其所有子对象推到队列中
void show_tree_by_levels(std::ostream& os, Node* tree) {
Node* sentinel = new Node;
std::deque<Node*> queue{tree, sentinel};
while (true) {
Node* here = queue.front();
queue.pop_front();
if (here == sentinel) {
os << std::endl;
if (queue.empty())
break;
else
queue.push_back(sentinel);
} else {
for (Node* child = here->child; child; child = child->sibling)
queue.push_back(child);
os << here->value << ' ';
}
}
}
void按级别显示树(std::ostream&os,Node*tree){
Node*sentinel=新节点;
std::deque队列{tree,sentinel};
while(true){
Node*here=queue.front();
queue.pop_front();
如果(此处==哨兵){
操作系统子级;子级;子级=子级->同级)
排队。推回(儿童);
os值
void show_tree_by_levels(std::ostream& os, Node* tree) {
Node* sentinel = new Node;
std::deque<Node*> queue{tree, sentinel};
while (true) {
Node* here = queue.front();
queue.pop_front();
if (here == sentinel) {
os << std::endl;
if (queue.empty())
break;
else
queue.push_back(sentinel);
} else {
for (Node* child = here->child; child; child = child->sibling)
queue.push_back(child);
os << here->value << ' ';
}
}
}
def printLevelWiseTree(tree):
q= queue.Queue()
if tree == None:
return None
q.put(tree)
while (not(q.empty())):
c = q.get()
print(c.data,end=":")
for i in range(len(c.children)):
if i != len(c.children)-1:
print(c.children[i].data,end=",")
else:
print(c.children[i].data,end="")
q.put(c.children[i])
print()