【问题标题】:Implemetning Tree with Map用地图实现树
【发布时间】:2015-05-12 08:42:29
【问题描述】:

我有一棵二叉树,比如 -

            1
           / \
          3   5  
             / \  
            7   9  

现在我尝试使用HashTable 来表示树。所以我创建了一个HashTable binaryTree -

HashTable binaryTree = new HashTable<Integer, Intgeger>();  

然后我尝试将项目添加到binaryTree。我希望 1 作为二元树的键,并且它的所有子节点(例如 - 3 和 5)作为它的值。所以我想把 -

binaryTree.put(1, 3);
binaryTree.put(1, 5);   

既然键为 1 的值有 2 个,那么第二个值没有插入到 HashTable - binaryTree 中?

如何将 3 和 5 添加到 binaryTree? 或者有没有更好的数据结构来做到这一点?

提前谢谢?

【问题讨论】:

  • 你需要两张地图——一张给左孩子,一张给右孩子——如果你打算这样做,或者你可以有一张从Integer到表示一对整数的类型。或者您根本无法使用 Map 来实现,而是将树表示为对象类型本身。

标签: java algorithm data-structures hashtable binary-tree


【解决方案1】:

您似乎正在尝试将邻接列表“折叠”到单个哈希表中。这是可能的,但您需要将元素的类型更改为能够容纳两个整数的类型。

最常见的方法是使用TreeNode 类:

class TreeNode {
    private final int left;
    private final int right;
    public int getLeft() { return left; }
    public int getRight() { return left; }
    TreeNode(int l, int r) { left = l; right = r; }
}

HashTable<Integer,TreeNode> binaryTree = new HashTable<Integer,TreeNode>();

现在插入看起来像这样:

binaryTree.put(1, new TreeNode(3, 5));

您也可以使用包含两个 ints 的数组来代替自定义类,但使用这种表示的代码将不那么可读:

HashTable<Integer,int[]> binaryTree = new HashTable<Integer,int[]>();
binaryTree.put(1, new int[] { 3, 5 });

【讨论】:

  • 哇!所以在第二种情况下,我可以使用 array/arrayList 来表示超过 2 个孩子。所以我认为第二个可以用来代表任何一棵树,对吗?
  • @Razib 是的,第二种方法可用于表示每个节点具有任意数量的子节点的树。
  • 非常感谢。我将尝试实施第二个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-30
相关资源
最近更新 更多