虽然这个问题已被提出,但我有一个特定的实施疑问。
我正在尝试打印二叉树的顶视图,以下是完整的代码:
import java.util.*;
class Node{
int data;
Node right;
Node left;
Node(int data){
this.data = data;
}
}
class Pair<F,S>{
private F first;
private S second;
public Pair(F first, S second){
this.first = first;
this.second = second;
}
public F getFirst(){return first;}
public S getSecond(){return second;}
}
class BinaryTreeTopView{
public static void printTopView(Node root){
if(root == null)
return;
Queue <Pair<Node,Integer>> q = new Queue<>();
Map <Integer,Node> map = new HashMap<>();
Pair<Node,Integer> p = new Pair<>(root, 0);
q.add(p);
/*
I am storing nodes and the corresponding horizontal distances
in the form of a pair which then are being stored in the queue
to ensure level order traversal
*/
while(!q.isEmpty()){
Pair<Node,Integer> temp = q.peek();
q.remove();
if(map.containsKey(temp.getSecond())==true){
map.put(temp.getSecond(),temp.getFirst());
} else {
System.out.println(temp.getFirst().data);
map.put(temp.getSecond(),temp.getFirst());
}
if(temp.getFirst().left!=null){
Pair<Node,Integer> left = new Pair<>(temp.getFirst().left, temp.getSecond()-1);
q.add(left);
}
if(temp.getFirst().right!=null){
Pair<Node,Integer> right = new Pair<> (temp.getFirst().right, temp.getSecond()+1);
q.add(right);
}
}
}
public static void main(String[] args) {
Node root = new Node(1);
root.left = new Node(2);
root.right = new Node(3);
root.left.right = new Node(5);
root.left.left = new Node(4);
root.right.left = new Node(6);
root.right.right = new Node(7);
root.right.left.right = new Node(8);
root.right.right.left = new Node(10);
root.right.right.right = new Node(9);
root.right.right.left.right = new Node(11);
root.right.right.left.right.right = new Node(12);
printTopView(root);
}
}
它编译得很好,但是在运行时会引发异常。 现在我得到了以下异常,我无法弄清楚问题是什么:
Exception in thread "main" java.lang.ClassCastException:
Pair cannot be cast to java.lang.Comparable at java.util.PriorityQueue.siftUpComparable(PriorityQueue.java:652)
at java.util.PriorityQueue.siftUp(PriorityQueue.java:647)
at java.util.PriorityQueue.offer(PriorityQueue.java:344)
at java.util.PriorityQueue.add(PriorityQueue.java:321)
答案 0 :(得分:2)
这是因为Pair并没有实现Comparable。实现它:
public class Pair implements Comparable<Pair> {
public int compareTo(Pair o) {
// ...
}
}
或在您的优先级队列中使用Comparator
使用比较器;
PriorityQueue<DummyObject> pq = new
PriorityQueue<DummyObject>(5, new DummyObjectComparator());
定义比较器:
class DummyObjectComparator implements Comparator<DummyObject>{
// Overriding compare()method of Comparator
public int compare(DummyObject s1, DummyObject s2) {
//some code
}
}
答案 1 :(得分:1)
您正在尝试将Pair
个实例添加到PriorityQueue
,因此您的Pair
课程必须为Comparable
。一个合理的实现可能是强制F
和S
自己Comparable
,然后按第一个元素进行比较,然后是第二个元素:
class Pair<F extends Comparable<F>, S extends Comparable<S>>
implements Comparable<Pair<F, S>> {
// All the code you already have is fine
@Override
public int compareTo(Pair<F, S> o) {
int retVal = getFirst().compareTo(o.getFirst());
if (retVal != 0) {
return retVal;
}
return getSecond().compareTo(o.getSecond());
}
}
答案 2 :(得分:0)
您的声明:
Queue <Pair<Node,Integer>> q = new Queue<>();
由于Queue
是接口且无法实例化,所以无法编译。我怀疑您改用了PriorityQueue
。
您是否真的需要优先级队列,还是简单的LinkedList
会适合您的算法?
更新:
BTW,带有LinkedList
的输出是:
1 2 3 4 7 9