我正在尝试垂直打印二叉树。我使用了Hashmap,其中一个节点与根的水平距离作为关键,节点的arraylist作为值。
根据主模块中的硬编码输入,树看起来像这样:
1
/ \
2 3
/ \ / \
4 5 6 7
需要的输出(当我打印hashmap条目时):
[0=[1,5,6], 1=[3], 2=[7], -2=[4], -1=[2]]
以下代码给出的输出:
[0=[1, 6], 1=[], 2=[], -2=[], -1=[]]
有人能在这里解释我的问题吗?
import java.util.ArrayList;
import java.util.HashMap;
public class TreeNode {
private int key;
private TreeNode left;
private TreeNode right;
public TreeNode(int key){this.key=key;}
public int key(){return key;}
public TreeNode left(){return left;}
public TreeNode right(){return right;}
public void setKey(int key){this.key=key;}
public void setLeft(TreeNode left){this.left=left;}
public void setRight(TreeNode right){this.right=right;}
}
public class Tree {
private TreeNode root;
public Tree(TreeNode root)
{
this.root=root;
}
public void verticalPrint() throws Exception{
HashMap<Integer,ArrayList<Integer>> hm;
hm = new HashMap<>();
verticalPrintTree(root,0,hm);
System.out.println(hm.entrySet());
}
private void verticalPrintTree(TreeNode root,int hd,HashMap<Integer,ArrayList<Integer>> hm) throws Exception{
if(root==null)
return;
verticalPrintTree(root.left(),hd-1,hm);
if(hm.get(hd)==null)
hm.put(hd,new ArrayList(root.key()));
else
hm.get(hd).add(root.key());
verticalPrintTree(root.right(),hd+1,hm);
}
public void printTree()
{
printInorder(root);
}
private void printInorder(TreeNode root) {
if(root==null)
return;
printInorder(root.left());
System.out.println(root.key());
printInorder(root.right());
}
}
public class TreeVerticalPrint {
public static void main(String args[]) throws Exception
{
TreeNode root=new TreeNode(1);
root.setLeft(new TreeNode(2));
root.setRight(new TreeNode(3));
root.left().setLeft(new TreeNode(4));
root.left().setRight(new TreeNode(5));
root.right().setLeft(new TreeNode(6));
root.right().setRight(new TreeNode(7));
Tree t= new Tree(root);
t.printTree();
t.verticalPrint();
}
}
答案 0 :(得分:0)
执行new ArrayList(root.key())
时constructing a list with a certain capacity,而不是构建已包含int
作为元素的列表。
你可以这样做:
new ArrayList(Collections.singleton(root.key()));
答案 1 :(得分:0)
代码是正确的,除了这部分(现在是正确的)
private void verticalPrintTree(TreeNode root, int hd, HashMap<Integer, ArrayList<Integer>> hm) throws Exception {
if (root == null) {
return;
}
verticalPrintTree(root.left(), hd - 1, hm);
if (hm.get(hd) == null) {
System.out.println("initializing element for index " + hd + " element " + root.key() );
ArrayList list = new ArrayList();
list.add(root.key());
hm.put(hd, list);
} else {
System.out.println("adding element " + root.key() + " for index " + hd);
hm.get(hd).add(root.key());
}
verticalPrintTree(root.right(), hd + 1, hm);
}
通过array list doc,您可以指定要添加到列表中的项目集合,也可以指定初始容量,因此您指定了错误的内容。您需要创建一个集合,然后将元素添加到它。最后,您可以将其存储在哈希值中。