方法一:
1. 带有父节点信息的节点:
public class FlatNode {
private Integer path;
private String name;
private Integer parent;
public Integer getPath() {
return path;
}
public void setPath(Integer path) {
this.path = path;
}
public Integer getParent() {
return parent;
}
public void setParent(Integer parent) {
this.parent = parent;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "FlatNode{" +
"path=" + path +
", name='" + name + '\'' +
", parent=" + parent +
'}';
}
}
2. 多叉树的节点:
public class MulNode {
private Integer path;
private String name;
private List<MulNode> childList;
public Integer getPath() {
return path;
}
public void setPath(Integer path) {
this.path = path;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<MulNode> getChildList() {
return childList;
}
public void setChildList(List<MulNode> childList) {
this.childList = childList;
}
public boolean hasChildren(MulNode node) {
return node.getChildList() != null && node.getChildList().size() > 0;
}
@Override
public String toString() {
return "MulNode{" +
"path=" + path +
", name='" + name + '\'' +
", childList=" + childList +
'}';
}
}
3.工具类,包括多叉树遍历查找节点方法(利用队列进行递归层序遍历 PS :从二叉树层序遍历得到的灵感)
二叉树转换成带有父节点信息的一位数组方法(同样是利用递归)
测试方法--main函数。
public class NodeUtils {
public static MulNode find(MulNode root, Integer value) {
Queue<MulNode> queue = new LinkedList<MulNode>();
queue.add(root);
return find(queue, value);
}
// 层序遍历
private static MulNode find(Queue<MulNode> queue, Integer value) {
MulNode res = null;
while (!queue.isEmpty()) {
MulNode node = queue.peek();
if (node.getPath().equals(value)) {
res = node;
break;
} else {
queue.remove();
if (node.hasChildren(node)) {
for (MulNode child : node.getChildList()) {
queue.add(child);
}
} else {
find(queue, value);
}
}
}
return res;
}
public static List<FlatNode> transfer(MulNode root) {
Queue<MulNode> queue = new LinkedList<MulNode>();
queue.add(root);
Queue<MulNode> parent = new LinkedList<MulNode>();
List<FlatNode> nodeList = new ArrayList<FlatNode>();
return transfer(queue, parent, nodeList);
}
private static List<FlatNode> transfer(Queue<MulNode> queue, Queue<MulNode> parent, List<FlatNode> nodeList) {
while (!queue.isEmpty()) {
MulNode node = queue.peek();
MulNode father = parent.peek();
FlatNode flatNode = new FlatNode();
flatNode.setName(node.getName());
flatNode.setPath(node.getPath());
if (father == null) {
flatNode.setParent(null);
} else {
flatNode.setParent(father.getPath());
parent.remove();
}
queue.remove();
nodeList.add(flatNode);
if (node.hasChildren(node)) {
for (MulNode child : node.getChildList()) {
queue.add(child);
parent.add(node);
}
} else {
transfer(queue, parent, nodeList);
}
}
return nodeList;
}
public static void main(String[] args) {
MulNode root = new MulNode();
root.setPath(0);
root.setName("root");
MulNode node1 = new MulNode();
node1.setPath(1);
node1.setName("Clothes");
MulNode node2 = new MulNode();
node2.setPath(2);
node2.setName("food");
MulNode node3 = new MulNode();
node3.setPath(3);
node3.setName("Animal");
MulNode node10 = new MulNode();
node10.setPath(10);
node10.setName("shoe");
MulNode node11 = new MulNode();
node11.setPath(11);
node11.setName("skirt");
MulNode node12 = new MulNode();
node12.setPath(12);
node12.setName("jacket");
MulNode node20 = new MulNode();
node20.setPath(20);
node20.setName("pizza");
MulNode node21 = new MulNode();
node21.setPath(21);
node21.setName("noodle");
MulNode node30 = new MulNode();
node30.setPath(30);
node30.setName("hen");
MulNode node31 = new MulNode();
node31.setPath(31);
node31.setName("pig");
MulNode node32 = new MulNode();
node32.setPath(32);
node32.setName("wolf");
MulNode node200 = new MulNode();
node200.setPath(200);
node200.setName("Italy Pizza");
List<MulNode> list1 = new ArrayList<MulNode>();
List<MulNode> list10 = new ArrayList<MulNode>();
List<MulNode> list20 = new ArrayList<MulNode>();
List<MulNode> list30 = new ArrayList<MulNode>();
List<MulNode> list200 = new ArrayList<MulNode>();
list200.add(node200);
node20.setChildList(list200);
list20.add(node20);
list20.add(node21);
node2.setChildList(list20);
list30.add(node30);
list30.add(node31);
list30.add(node32);
node3.setChildList(list30);
list10.add(node10);
list10.add(node11);
list10.add(node12);
node1.setChildList(list10);
list1.add(node1);
list1.add(node2);
list1.add(node3);
root.setChildList(list1);
System.out.println(root);
System.out.println(find(root, 32));
System.out.print(transfer(root));
}
}
方法二:利用map来构造树形结构:
public class MulNode {
private int id;
private int parentId;
MulNode parent;
List<MulNode> childList;
String code;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getParentId() {
return parentId;
}
public void setParentId(int parentId) {
this.parentId = parentId;
}
public MulNode getParent() {
return parent;
}
public void setParent(MulNode parent) {
this.parent = parent;
}
public List<MulNode> getChildList() {
return childList;
}
public void setChildList(List<MulNode> childList) {
this.childList = childList;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public MulNode(int id, int parentId, MulNode parent, List<MulNode> childList, String code) {
this.id = id;
this.parentId = parentId;
this.parent = parent;
this.childList = childList;
this.code = code;
}
//根据List构造树形结构
public Map<Integer, MulNode> generateTree(List<MulNode> nodeList) {
Map<Integer, MulNode> treeMap = new HashMap<Integer, MulNode>();
for (MulNode node : nodeList) {
treeMap.put(node.getId(), node);
}
for (MulNode value : treeMap.values()) {
MulNode parent = treeMap.get(value.getParentId());
if (parent != null) {
parent.getChildList().add(value);
value.setParent(parent);
}
}
return treeMap;
}
//构造path结构
public Map<String, MulNode> generateTreePath(Map<Integer, MulNode> treeMap) {
Map<String, MulNode> pathMap = new HashMap<String, MulNode>();
for (MulNode value : treeMap.values()) {
pathMap.put(generateTreePath(value), value);
}
return pathMap;
}
/**
* 生成 具体配置 Path
*
* @param node
* @return
*/
public String generateTreePath(MulNode node) {
if (null == node.getParent()) {
return node.getCode();
} else {
return generateTreePath(node.getParent()) + "/" + node.getCode();
}
}
}
相关推荐
在这个项目中,由于树形菜单可能包含多层数据,但一般不会过大,`DOM`解析器可能是更好的选择,因为它允许我们方便地查找和修改菜单节点。 在Java中,我们可以使用`javax.xml.parsers.DocumentBuilderFactory`和`...
字典树(Trie树)是一种多叉树结构,它能够快速检索字符串,是词典应用和搜索引擎中常见的一种数据结构。判定树用于决策支持系统,而带权路径长度最短的树(Huffman树)则是数据压缩与编码的关键技术。此外,由字符...
字典树是一种多叉树,每个节点代表一个字符串的前缀。根节点不包含任何字符,而每个非叶子节点都有一个字符,并指向其所有可能的后继字符。叶子节点通常表示字典中的完整单词。通过这种方式,我们可以沿着树的路径...
- 二叉树每个节点最多有两个子节点,而多叉树则没有这个限制。JavaScript中的树结构通常可以表示任意叉数的树。 - 二叉树有特殊的类型,如二叉查找树(BST)、平衡二叉树(AVL、红黑树等),它们具有特定的性质,...
4. **N叉树**:每个节点可以有任意数量的子节点,比如文件系统中的目录结构就是一个典型的多叉树。 5. **B树和B+树**:为数据库和文件系统设计的高效数据结构,适合在磁盘等慢速存储上操作。它们具有多个子节点,...
在数据结构中,我们通常用二叉树(每个节点最多有两个子节点)和多叉树(每个节点有超过两个子节点)来讨论树的相关性质和操作。例如,二叉搜索树是一种特殊的二叉树,其中每个节点的左子树只包含小于该节点的元素,...
逻辑结构包括集合、线性结构(如数组、链表)、树形结构(如二叉树、多叉树)和图形结构。物理结构包括顺序存储(如数组)、链接存储(如链表)、索引存储(如B树)和散列存储(如哈希表)。每种数据结构都有其独特...
10. **多叉树的节点数量**: - 高度为h的3叉树最多包含(3^h - 1) / 2个节点。 11. **二叉树的性质**: - 二叉搜索树中,左子树所有节点的值小于父节点,右子树所有节点的值大于等于父节点。 12. **堆的特性**: ...
Trie树,又称前缀树或字典树,是一种用于快速查找的多叉树结构。在Trie树中,字符串的公共前缀被共享,从而节省存储空间并加快查找速度。Trie树常用于IP路由查找、关键词过滤等场景。 4. 散列(Hashing) 散列是将...
对于多叉树,能够找到一个成为二叉树的等价转换。 7. Graph as Matrix(图—>方阵) Graph as Matrix是一种图形数据结构,将图形结构转换为矩阵形式。无向图(d)对应对称方阵;有向图对应一般0-1方阵。带权图...
- B树和B+树都是平衡的多叉树,用于文件索引,支持顺序和随机检索。B+树更适用于数据库索引,因为它所有叶子节点都有指针指向下一个叶子节点,便于顺序检索。 10. **栈和链表的应用**: - 若线性表最常用的操作是...
- **转换方法**:将多叉树转换为二叉树的过程通常涉及使用空节点来填充缺失的部分,以及调整节点间的连接关系。 **4.4 二叉排序树** - **二叉排序树的插入**:遵循二叉排序树的性质,确保插入的新节点满足二叉排序...
字典树是一种多叉树结构,特别适用于字符串集合的存储和查找。实现字典树的关键在于: 1. **节点结构**:每个节点包含多个子节点指针,分别对应字母表中的各个字符。 2. **插入操作**:从根节点开始,根据字符逐层...
树转换成二叉树通常指的是将多叉树转换成等价的二叉树。这种转换主要是通过定义每个节点的左子树和右子树来完成的。左子树包含原节点的所有子节点,而右子树则用于链接兄弟节点。 #### 四、森林转化为相应的二叉树 ...
常见的数据结构有链表、数组、哈希表等,但在这个场景下,二叉树或多叉树更为合适,因为它们能很好地模拟层级关系。 2. **递归算法**:为了将扁平化的数据转换成树形结构,我们需要用到递归算法。递归遍历数据,...
kd树是一种分割空间的方法,通过不断地将数据集按照坐标轴进行划分,构建出一个多叉树结构。每次划分都沿着当前子空间的一个维度进行,选择最优的划分点以最大化不同区域内的数据点差异。这个过程称为“分割”。kd树...
在题目中提到的“任一棵树均可唯一地转换成与它对应的二叉树”这一知识点,指的是树(一种多叉树)可以通过特定规则转化为二叉树。在转换过程中,一个树中的节点N在对应的二叉树中的左子女是N在原树里的最左子结点...