您好我正在尝试以(node element, parent node element)
格式打印二叉搜索树的级别顺序。我目前正在使用队列来获取级别顺序,但我很难获得父节点。是否可以使用队列?如果是这样我怎么去做呢?如果不是更好的方式呢?谢谢!
例如,使用以下树:
6
/ \
5 7
等级0:(6,null)
等级1:(5,6)(7,6)
答案 0 :(得分:1)
所以遗憾的是,假设您的节点只有左,右和值,则没有办法严格对待一个队列。问题是,一旦你深入了解> 0,该级别的节点可能具有不同的父节点,并且除非您以某种方式存储它,否则该信息将消失。
执行此操作的简单方法是在Node类中添加Node父级。除此之外,您还可以创建一个内部类来保存Node到父节点的映射,或者您可以使用任意数量的数据结构。下面我介绍了如何使用hashmaps执行此操作。
public void printLevelOrder(){
Queue<Node> q = new LinkedList<Node>();
Map<Node, Node> parents = new HashMap<Node,Node>();
Node nextLevel = null;
q.add(this);
int lvl = 0;
while (!q.isEmpty()){
Node n = q.remove();
if (n == nextLevel || nextLevel == null){
System.out.print("\nlvl " + lvl++ +" ");
nextLevel = null;
}
System.out.print("("+n.value +","+parents.remove(n)+")");
if (n.left != null){
q.add(n.left);
parents.put(n.left, n);
if (nextLevel == null)
nextLevel = n.left;
}
if (n.right != null){
q.add(n.right);
parents.put(n.right, n);
if (nextLevel == null)
nextLevel = n.right;
}
}
}
要按级别打印节点,请执行以下操作。通过添加第一个非null nextLevel节点来确定下一级别。当我们到达那个节点时,我们知道我们处于下一行的开头,并再次将其清空。