`
啸笑天
  • 浏览: 3460085 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

【code】java树的实现

阅读更多

树的父节点存储实现

import java.util.*;
public class TreeParent<E>
{
	public static class Node<T>
	{
		T data;
		//记录其父节点的位置
		int parent;
		public Node()
		{
		}
		public Node(T data)
		{
			this.data = data;
		}
		public Node(T data , int parent)
		{
			this.data = data;
			this.parent = parent;
		}
		public String toString()
		{
			return "TreeParent$Node[data=" + data + ", parent="
				+ parent + "]";
		}
	}
	private final int DEFAULT_TREE_SIZE = 100;
	private int treeSize = 0;
	//使用一个Node[]数组来记录该树里的所有节点
	private Node<E>[] nodes;
	//记录节点数
	private int nodeNums;
	//以指定根节点创建树
	public TreeParent(E data)
	{
		treeSize = DEFAULT_TREE_SIZE;
		nodes = new Node[treeSize];
		nodes[0] = new Node<E>(data , -1);
		nodeNums++;
	}
	//以指定根节点、指定treeSize创建树
	public TreeParent(E data ,int treeSize)
	{
		this.treeSize = treeSize;
		nodes = new Node[treeSize];
		nodes[0] = new Node<E>(data , -1);
		nodeNums++;
	}
	//为指定节点添加子节点
	public void addNode(E data , Node parent)
	{
		for (int i = 0 ; i < treeSize ; i++)
		{
			//找到数组中第一个为null的元素,该元素保存新节点
			if (nodes[i] == null)
			{
				//创建新节点,并用指定的数组元素保存它
				nodes[i] = new Node(data , pos(parent));;
				nodeNums++;
				return;
			}
		}
		throw new RuntimeException("该树已满,无法添加新节点");
	}
	//判断树是否为空。
	public boolean empty()
	{
		//根节点是否为null
		return nodes[0] == null;
	}
	//返回根节点
	public Node<E> root()
	{
		//返回根节点
		return nodes[0];
	}
	//返回指定节点(非根节点)的父节点。
	public Node<E> parent(Node node)
	{
		//每个节点的parent记录了其父节点的位置
		return nodes[node.parent];
	}
	//返回指定节点(非叶子节点)的所有子节点。
	public List<Node<E>> children(Node parent)
	{
		List<Node<E>> list = new ArrayList<Node<E>>();
		for (int i = 0 ; i < treeSize  ; i++)
		{
			//如果当前节点的父节点的位置等于parent节点的位置
			if (nodes[i] != null &&
				nodes[i].parent == pos(parent))
			{
				list.add(nodes[i]);
			}
		}
		return list;
	}
	//返回该树的深度。
	public int deep()
	{
		//用于记录节点的最大深度
		int max = 0;
		for(int i = 0 ; i < treeSize && nodes[i] != null
			; i++)
		{
			//初始化本节点的深度
			int def = 1;
			//m记录当前节点的父节点的位置
			int m = nodes[i].parent;
			//如果其父节点存在
			while(m != -1 && nodes[m] != null)
			{
				//向上继续搜索父节点
				m = nodes[m].parent;
				def++;
			}
			if(max < def)
			{
				max = def;
			}
		}
		//返回最大深度
		return max; 
	}
	//返回包含指定值的节点。
	public int pos(Node node)
	{
		for (int i = 0 ; i < treeSize ; i++)
		{
			//找到指定节点
			if (nodes[i] == node)
			{
				return i;
			}
		}
		return -1;
	}
	
	public static void main(String[] args) 
	{
		TreeParent<String> tp = new TreeParent<String>("root");
		TreeParent.Node root = tp.root();
		System.out.println(root);
		tp.addNode("节点1" , root);
		System.out.println("此树的深度:" + tp.deep());
		tp.addNode("节点2" , root);
		//获取根节点的所有子节点
		List<TreeParent.Node<String>> nodes = tp.children(root);
		System.out.println("根节点的第一个子节点:" + nodes.get(0));
		//为根节点的第一个子节点新增一个子节点
		tp.addNode("节点3" , nodes.get(0));
		System.out.println("此树的深度:" + tp.deep());
	}
}
 

树的子节点链表实现

import java.util.*;
public class TreeChild<E>
{
	private static class SonNode
	{
		//记录当前节点的位置
		private int pos;
		private SonNode next;
		public SonNode(int pos , SonNode next)
		{
			this.pos = pos;
			this.next = next;
		}
	}
	public static class Node<T>
	{
		T data;
		//记录第一个子节点
		SonNode first;
		public Node(T data)
		{
			this.data = data;
			this.first = null;
		}
		public String toString()
		{
			if (first != null)
			{
				return "TreeChild$Node[data=" + data + ", first="
					+ first.pos + "]";
			}
			else
			{
				return "TreeChild$Node[data=" + data + ", first=-1]";
			}
		}
	}
	private final int DEFAULT_TREE_SIZE = 100;
	private int treeSize = 0;
	//使用一个Node[]数组来记录该树里的所有节点
	private Node<E>[] nodes;
	//记录节点数
	private int nodeNums;
	//以指定根节点创建树
	public TreeChild(E data)
	{
		treeSize = DEFAULT_TREE_SIZE;
		nodes = new Node[treeSize];
		nodes[0] = new Node<E>(data);
		nodeNums++;
	}
	//以指定根节点、指定treeSize创建树
	public TreeChild(E data ,int treeSize)
	{
		this.treeSize = treeSize;
		nodes = new Node[treeSize];
		nodes[0] = new Node<E>(data);
		nodeNums++;
	}
	//为指定节点添加子节点
	public void addNode(E data , Node parent)
	{
		for (int i = 0 ; i < treeSize ; i++)
		{
			//找到数组中第一个为null的元素,该元素保存新节点
			if (nodes[i] == null)
			{
				//创建新节点,并用指定数组元素来保存它
				nodes[i] = new Node(data);
				if (parent.first == null)
				{
					parent.first = new SonNode(i , null);
				}
				else
				{
					SonNode next = parent.first;
					while (next.next != null)
					{
						next = next.next;
					}
					next.next = new SonNode(i , null);
				}
				nodeNums++;
				return;
			}
		}
		throw new RuntimeException("该树已满,无法添加新节点");
	}
	//判断树是否为空。
	public boolean empty()
	{
		//根节点是否为null
		return nodes[0] == null;
	}
	//返回根节点
	public Node<E> root()
	{
		//返回根节点
		return nodes[0];
	}
	//返回指定节点(非叶子节点)的所有子节点。
	public List<Node<E>> children(Node parent)
	{
		List<Node<E>> list = new ArrayList<Node<E>>();
		//获取parent节点的第一个子节点
		SonNode next = parent.first;
		//沿着孩子链不断搜索下一个孩子节点
		while (next != null)
		{
			//添加孩子链中的节点
			list.add(nodes[next.pos]);
			next = next.next;
		}
		return list;
	}
	//返回指定节点(非叶子节点)的第index个子节点。
	public Node<E> child(Node parent , int index)
	{
		//获取parent节点的第一个子节点
		SonNode next = parent.first;
		//沿着孩子链不断搜索下一个孩子节点
		for (int i = 0 ; next != null  ; i++)
		{
			if (index == i)
			{
				return nodes[next.pos];
			}
			next = next.next;
		}
		return null;
	}
	//返回该树的深度。
	public int deep()
	{
		//获取该树的深度
		return deep(root()); 
	}
	//这是一个递归方法:每棵子树的深度为其所有子树的最大深度 + 1
	private int deep(Node node)
	{
		if (node.first == null)
		{
			return 1;
		}
		else
		{
			//记录其所有子树的最大深度
			int max = 0;
			SonNode next = node.first;
			//沿着孩子链不断搜索下一个孩子节点
			while (next != null)
			{
				//获取以其子节点为根的子树的深度
				int tmp = deep(nodes[next.pos]);
				if (tmp > max)
				{
					max = tmp;
				}
				next = next.next;
			}
			//最后返回其所有子树的最大深度 + 1
			return max + 1;
		}
	}
	//返回包含指定值的节点。
	public int pos(Node node)
	{
		for (int i = 0 ; i < treeSize ; i++)
		{
			//找到指定节点
			if (nodes[i] == node)
			{
				return i;
			}
		}
		return -1;
	}
	
	public static void main(String[] args) 
	{
		TreeChild<String> tp = new TreeChild<String>("root");
		TreeChild.Node root = tp.root();
		System.out.println("根节点:" + root);
		tp.addNode("节点1" , root);
		tp.addNode("节点2" , root);
		tp.addNode("节点3" , root);
		System.out.println("添加子节点后的根节点:" + root);
		System.out.println("此树的深度:" + tp.deep());
		//获取根节点的所有子节点
		List<TreeChild.Node<String>> nodes = tp.children(root);
		System.out.println("根节点的第一个子节点:" + nodes.get(0));
		//为根节点的第一个子节点新增一个子节点
		tp.addNode("节点4" , nodes.get(0));
		System.out.println("根节点的第一个子节点:" + nodes.get(0));
		System.out.println("此树的深度:" + tp.deep());
	}
}
 


分享到:
评论

相关推荐

    java 数据结构code

    【标题】:“Java 数据结构code”指的是在Java编程语言中实现的数据结构的代码示例。数据结构是计算机科学中组织和存储数据的方式,以便高效地访问和管理它们。Java作为一种面向对象的语言,提供了多种内置数据结构...

    基于java实现的 决策树之 ID3 算法

    在本案例中,我们将探讨如何用Java实现ID3算法,这是一种早期的决策树学习算法,由Ross Quinlan于1986年提出。 ID3(Iterative Dichotomiser 3)算法基于信息熵和信息增益来选择最优特征进行分裂。信息熵是度量数据...

    Rplus-java.zip_R tree_R tree code_Rplus_R树 java_R树java

    在这个名为"Rplus-java.zip"的压缩包中,包含了一系列的Java源代码文件,这些文件可能是实现R+树算法的一个Java库或项目。让我们一一解析这些文件: 1. `node.java`:这个文件可能定义了R+树的节点类,包含了节点的...

    hafuman.rar_huffman java_huffman java code_java 哈夫曼_哈夫曼树的

    本教程将详细介绍哈夫曼树的构建过程以及其在Java中的实现。 哈夫曼编码的基本原理是通过赋予频率较高的字符较短的编码,频率较低的字符较长的编码,从而在总体上达到最优的编码效率。这个过程分为两个主要步骤:一...

    HuffmanCode_java.rar_HuffmanCode_java_huffman java_huffman 文本_hu

    哈夫曼编码在Java中的应用不仅限于文本压缩,例如在`huffmancode_java sms_compression`标签中提及,它还可以应用于短信压缩,节省通信资源。在现代信息技术中,数据压缩技术扮演着至关重要的角色,哈夫曼编码作为一...

    基于java语言实现ID3决策树,读取ARFF文件生成树状决策树

    决策树是一种常用的...总之,基于Java的ID3决策树实现涉及数据处理、熵和信息增益计算、决策树构建和预测等多个环节。理解并掌握这些知识,对于从事数据挖掘、机器学习以及人工智能相关工作的专业人士来说至关重要。

    Tree-ID3-Java-Code.zip_ID3 决策树 java_id3 java 决策树

    在压缩包"Tree-ID3 Java Code"中,包含了ID3决策树算法的Java源代码,用户可以在Eclipse环境下编译运行,观察算法对给定数据集的分类效果。此代码可作为一个基础框架,供开发者理解和学习决策树算法,也可以在此基础...

    huffman编码java实现

    在这个Java程序中,`huffman()`函数负责构建哈夫曼树,而`code()`函数则负责分配编码。`main()`函数是整个流程的入口,初始化权重数组,创建并填充优先级队列,然后调用`huffman()`和`code()`函数完成编码过程,并...

    snl java实现

    5. `CodeGenerator.java`:代码生成器的实现。 6. `SNLCompiler.java`:整合以上各部分的主类,用于驱动整个编译过程。 7. `SNL.g4`或`SNL.jj`:ANTLR或JavaCC的语法定义文件。 8. 测试文件:包含SNL语言的源代码...

    HuffmanCode_Java_SourceCode.rar_code_huffman_huffman java code_h

    综上所述,`HuffmanCode_Java_SourceCode.rar`中包含的代码应该实现了从字符频率统计、哈夫曼树构建、编码和解码等一系列过程,从而提供了一种在Java环境中高效压缩和解压数据的方法。通过学习这段代码,开发者可以...

    cart_java_code.rar_CART 分类 java_cart_java_code

    这个名为"cart_java_code.rar_CART 分类 java_cart_java_code"的压缩包包含了一个用Java语言实现的CART分类器的源代码。下面将详细解释CART算法的基本原理、分类过程以及Java实现的关键点。 CART算法主要由以下步骤...

    基于java实现的语法分析器及词法分析器

    在"SyntaxAnalyzer-code"这个文件中,很可能包含了实现这两个分析器的Java源代码。通常,源代码会包含以下几个部分: 1. 词法分析器类:使用正则表达式或其他方法定义记号,并创建一个迭代器以按顺序处理输入源代码...

    LR(0).rar_LR_LR java_LR(0)_parser code java_parser java

    这个“LR(0).rar_LR_LR java_LR(0)_parser code java_parser java”压缩包显然包含了用Java语言实现的LR(0)语法分析器的源代码。下面我们将深入探讨LR(0)解析器的工作原理、Java实现的关键点以及相关知识点。 **LR...

    在java中 遍历mysql中的树形结构

    本文将深入探讨如何利用Java语言和MySQL数据库来实现这一功能,解析给定代码片段,并提供一种高效遍历树形结构的方法。 ### 一、理解树形结构 树形结构是一种非线性的数据结构,它由节点和边组成,其中每个节点...

    java算法练习代码code

    在Java中,我们可以使用各种数据结构(如数组、链表、栈、队列、树和图等)来辅助实现这些算法。 1. **排序算法**:Java代码可能会包含常见的排序算法,如冒泡排序、插入排序、选择排序、快速排序、归并排序和堆...

    简单的编译器 使用java语言实现

    本项目"简单的编译器 使用java语言实现"为我们提供了一个基础的编译器模型,适合初学者进行课程设计或者学习编译器原理。下面将详细解释其中涉及的知识点。 首先,我们要理解什么是编译器。编译器是计算机程序,它...

    Java_Programming_classic_tree_parameter_code.rar_java programmin

    在Java中,`java.util.TreeSet`和`java.util.TreeMap`是基于红黑树实现的集合类,提供了排序和高效的查找功能。此外,`java.awt.Tree`和`javax.swing.JTree`用于图形用户界面中的树视图展示。 6. **应用场景** 树...

    java_code_of_algorithms.rar_MST code_dfs java_mst

    在给定的“java_code_of_algorithms.rar”压缩包中,包含了多个Java代码实现的数据结构和算法,重点涉及了最小生成树(Minimum Spanning Tree, MST)、深度优先搜索(Depth First Search, DFS)以及其他的排序算法。...

    code-for-java.rar_java 预测

    在“code-for-java.rar_java 预测”这个压缩包中,主要包含了一个名为“code for java.txt”的文件,这通常意味着它是一个关于使用Java语言实现的预测算法或模型的代码文档。根据描述,我们可以推测这是一个用Java...

    赫夫曼编码的Java实现

    总结来说,赫夫曼编码的Java实现主要包括构建赫夫曼树、生成编码表以及压缩和解压缩数据。通过合理利用数据结构和算法,我们可以有效地实现这一经典的数据压缩技术。在实际项目中,赫夫曼编码可以应用于文本、图像等...

Global site tag (gtag.js) - Google Analytics