`
啸笑天
  • 浏览: 3435544 次
  • 性别: 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());
	}
}
 


分享到:
评论

相关推荐

    splay tree C# code 伸展树的C#代码实现

    splay tree C# code 伸展树的C#代码实现 我看到没有C#实现版本,所以就把java代码转化成C#实现了一把

    HuffmanCode.java

    赫夫曼树实现文件和字符串压缩及解压源码

    java开源包4

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    JAVA上百实例源码以及开源项目

    百度云盘分享 ... Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText();...

    java开源包3

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    JAVA上百实例源码以及开源项目源代码

     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器地址  ...

    树形结构结点编码表

    对树形结构的结点从1开始,自上而下,自左而右按层序编码,编码是64进制数,用java语言实现。对存取在mysql数据库的树形结构应该有帮助。 对一棵树的结点进行编码的步骤如下: 首先,对根节点编码,调用TreeCodeSet....

    java开源包11

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包6

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包9

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包5

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包8

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包10

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    jctree:树作为Java集合的实现

    Java集合神秘地缺少树实现。 该项目试图通过提供Java集合类型的类并支持诸如分层结构之类的树来解决此问题。 要在基于Maven的项目中使用jctree,请使用以下命令: &lt;groupId&gt;com.googlecode.jctree&lt;/groupId&gt; ...

    java开源包1

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java基础入门教程

    工 业 界 不 少 人 预 言 :"Java 语 言 的 出 现 ,将 会 引 起 一 场软 件革 命 ",这 是 因 为 传统 的 软 件 往 往 都 是 与 具 体 的 实现 环 境 有 关 ,换 了 一 个 环 境 就需 要 作 一 番 改 动 ,耗时 费 力 ,...

    collectionJava源码-collection-source-code-analyze:Java集合类源代码分析

    collection-source-code-analyze(Java集合类源代码分析) 对集合类源代码进行分析主要对增删改查操作的源代码进行分析, 因为这四个操作才是集合中最重要的, 其它的操作示情况进行分析, 分析的流程我采用的是自己仿照...

    JavaSourceCodePracticeSolveProblems:Java源代码。 阶乘,斐波那契,二叉搜索树实现和素数-Search source code

    JavaSourceCodePracticeSolveProblems:Java源代码。 阶乘,斐波那契,二叉搜索树实现和素数

    JAVA面试题最全集

    7.Java多态的实现(继承、重载、覆盖) 8.编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串。 9.Java中访问数据库的步骤,Statement和PreparedStatement之间的区别。 10.找出下列代码可能...

    java开源包2

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

Global site tag (gtag.js) - Google Analytics