java树形结构实现方式_java实现树形结构
在Java中实现树形结构的常见方式有以下几种,每种方法适用于不同的场景:
1. 自定义节点类(基础实现)
通过定义节点类,包含子节点的集合(如 List
),适合通用树结构。
class TreeNode { T data; List<TreeNode> children; public TreeNode(T data) { this.data = data; this.children = new ArrayList(); }}// 示例用法TreeNode root = new TreeNode(\"Root\");root.children.add(new TreeNode(\"Child1\"));
适用场景:多叉树、普通树结构。
2. 二叉树节点类
每个节点包含左、右子节点,适用于二叉树。
class BinaryTreeNode { T data; BinaryTreeNode left; BinaryTreeNode right; public BinaryTreeNode(T data) { this.data = data; }}// 示例用法BinaryTreeNode root = new BinaryTreeNode(1);root.left = new BinaryTreeNode(2);root.right = new BinaryTreeNode(3);
适用场景:二叉树、二叉搜索树、堆结构。
3. 数组表示法
使用数组存储节点,通过索引计算父子关系,适用于完全二叉树。
// 示例:完全二叉树的数组表示Integer[] treeArray = new Integer[10];treeArray[0] = 1; // 根节点treeArray[1] = 2; // 左子节点(索引0的左孩子)treeArray[2] = 3; // 右子节点(索引0的右孩子)
适用场景:堆、完全二叉树。
4. Map 表示法
使用 Map<T, List>
存储父子关系,适合快速查找子节点。
Map<String, List> treeMap = new HashMap();treeMap.put(\"Root\", Arrays.asList(\"Child1\", \"Child2\"));treeMap.put(\"Child1\", Arrays.asList(\"Grandchild1\"));
适用场景:需要快速查找子节点的场景(如某些算法题)。
5. Java集合框架的树结构
使用 TreeSet
或 TreeMap
(基于红黑树实现,自动排序)。
TreeSet treeSet = new TreeSet();treeSet.add(3);treeSet.add(1); // 内部按升序排列(1, 3)TreeMap treeMap = new TreeMap();treeMap.put(\"B\", 2);treeMap.put(\"A\", 1); // 按键排序(A, B)
适用场景:需要有序存储或快速查找/插入/删除。
6. 邻接表表示法
使用列表或数组存储每个节点的邻接节点,适合处理图或树。
List<List> adjacencyList = new ArrayList();adjacencyList.add(Arrays.asList(1, 2)); // 根节点0的子节点1和2adjacencyList.add(new ArrayList()); // 节点1无子节点
适用场景:多叉树、图的遍历(如BFS/DFS)。
7. 第三方库
-
Apache Commons Collections: 提供
Tree
接口。 - Google Guava: 使用
TreeTraverser
简化遍历。
// 示例:Guava的树遍历TreeTraverser<TreeNode> traverser = new TreeTraverser() { @Override public Iterable<TreeNode> children(TreeNode root) { return root.children; }};
适用场景:需要快速实现复杂操作(如遍历、查找)。
选择建议
-
简单树结构:自定义节点类。
-
完全二叉树:数组表示法(节省空间)。
-
需自动排序:
TreeSet
/TreeMap
。 -
算法题或快速查找:Map或邻接表。