尝试使用Java中的HashMap垂直打印二叉树

时间:2014-04-21 13:06:55

标签: java arraylist hashmap binary-tree

我正在尝试垂直打印二叉树。我使用了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();

      }

  }

2 个答案:

答案 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,您可以指定要添加到列表中的项目集合,也可以指定初始容量,因此您指定了错误的内容。您需要创建一个集合,然后将元素添加到它。最后,您可以将其存储在哈希值中。