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

【code】java二叉树深(先中后)、广遍历

阅读更多

 

import java.util.*;

public class ThreeLinkBinTree<E>
{
	public static class TreeNode
	{
		Object data;
		TreeNode left;
		TreeNode right;
		TreeNode parent;
		public TreeNode()
		{
		}
		public TreeNode(Object data)
		{
			this.data = data;
		}
		public TreeNode(Object data , TreeNode left
			, TreeNode right , TreeNode parent)
		{
			this.data = data;
			this.left = left;
			this.right = right;
			this.parent = parent;
		}
		public String toString()
		{
			return data.toString();
		}
	}
	private TreeNode root;
	//以默认的构造器来创建二叉树
	public ThreeLinkBinTree()
	{
		this.root = new TreeNode();
	}
	//以指定根元素来创建二叉树
	public ThreeLinkBinTree(E data)
	{
		this.root = new TreeNode(data);
	}
	/**
	 * 为指定节点添加子节点。
	 * @param index 需要添加子节点的父节点的索引
	 * @param data 新子节点的数据
	 * @param isLeft 是否为左节点
	 * @return 新增的节点
	 */
	public TreeNode addNode(TreeNode parent , E data
		, boolean isLeft)
	{
		if (parent == null)
		{
			throw new RuntimeException(parent +
				"节点为null,无法添加子节点");
		}
		if (isLeft && parent.left != null)
		{
			throw new RuntimeException(parent +
				"节点已有左子节点,无法添加左子节点");
		}
		if (!isLeft && parent.right != null)
		{
			throw new RuntimeException(parent +
				"节点已有右子节点,无法添加右子节点");
		}
		TreeNode newNode = new TreeNode(data);
		if (isLeft)
		{
			//让父节点的left引用指向新节点
			parent.left = newNode;
		}
		else
		{
			//让父节点的left引用指向新节点
			parent.right = newNode;
		}
		//让新节点的parent引用到parent节点
		newNode.parent = parent;
		return newNode;
	}
	//判断二叉树是否为空。
	public boolean empty()
	{
		//根据根元素来判断二叉树是否为空
		return root.data == null;
	}
	//返回根节点。
	public TreeNode root()
	{
		if (empty())
		{
			throw new RuntimeException("树为空,无法访问根节点");
		}
		return root;
	}
	//返回指定节点(非根节点)的父节点。
	public E parent(TreeNode node)
	{
		if (node == null)
		{
			throw new RuntimeException(node +
				"节点为null,无法访问其父节点");
		}
		return (E)node.parent.data;
	}
	//返回指定节点(非叶子)的左子节点。当左子节点不存在时返回null
	public E leftChild(TreeNode parent)
	{
		if (parent == null)
		{
			throw new RuntimeException(parent +
				"节点为null,无法添加子节点");
		}
		return parent.left == null ? null : (E)parent.left.data;
	}
	//返回指定节点(非叶子)的右子节点。当右子节点不存在时返回null
	public E rightChild(TreeNode parent)
	{
		if (parent == null)
		{
			throw new RuntimeException(parent +
				"节点为null,无法添加子节点");
		}
		return parent.right == null ? null : (E)parent.right.data;
	}
	//返回该二叉树的深度。
	public int deep()
	{
		//获取该树的深度
		return deep(root); 
	}
	//这是一个递归方法:每棵子树的深度为其所有子树的最大深度 + 1
	private int deep(TreeNode node)
	{
		if (node == null)
		{
			return 0;
		}
		//没有子树
		if (node.left == null
			&& node.right == null)
		{
			return 1;
		}
		else
		{
			int leftDeep = deep(node.left);
			int rightDeep = deep(node.right);
			//记录其所有左、右子树中较大的深度
			int max = leftDeep > rightDeep ? 
				leftDeep : rightDeep;
			//返回其左右子树中较大的深度 + 1
			return max + 1;
		}
	}
	//实现先序遍历
	public List<TreeNode> preIterator()
	{
		return preIterator(root);
	}
	private List<TreeNode> preIterator(TreeNode node)
	{
		List<TreeNode> list = new ArrayList<TreeNode>();
		//处理根节点
		list.add(node);
		//递归处理左子树
		if (node.left != null)
		{
			list.addAll(preIterator(node.left));
		}
		//递归处理右子树
		if (node.right != null)
		{
			list.addAll(preIterator(node.right));
		}
		return list;
	}
	//实现中序遍历
	public List<TreeNode> inIterator()
	{
		return inIterator(root);
	}
	private List<TreeNode> inIterator(TreeNode node)
	{
		List<TreeNode> list = new ArrayList<TreeNode>();
		//递归处理左子树
		if (node.left != null)
		{
			list.addAll(inIterator(node.left));
		}
		//处理根节点
		list.add(node);
		//递归处理右子树
		if (node.right != null)
		{
			list.addAll(inIterator(node.right));
		}
		return list;
	}
	public List<TreeNode> postIterator()
	{
		return postIterator(root);
	}
	//实现后序遍历
	private List<TreeNode> postIterator(TreeNode node)
	{
		List<TreeNode> list = new ArrayList<TreeNode>();
		//递归处理左子树
		if (node.left != null)
		{
			list.addAll(postIterator(node.left));
		}
		//递归处理右子树
		if (node.right != null)
		{
			list.addAll(postIterator(node.right));
		}
		//处理根节点
		list.add(node);
		return list;
	}
	//广度优先遍历
	public List<TreeNode> breadthFirst()
	{
		Queue<TreeNode> queue = new ArrayDeque<TreeNode>();
		List<TreeNode> list = new ArrayList<TreeNode>();
		if( root != null)
		{
			//将根元素加入“队列”
			queue.offer(root);
		}
		while(!queue.isEmpty())
		{
			//将该队列的“队尾”的元素添加到List中
			list.add(queue.peek());
			TreeNode p = queue.poll();
			//如果左子节点不为null,将它加入“队列”
			if(p.left != null)
			{
				queue.offer(p.left);
			}
			//如果右子节点不为null,将它加入“队列”
			if(p.right != null)
			{
				queue.offer(p.right);
			}
		}
		return list;
	}
	
	
	public static void main(String[] args) 
    {
        ThreeLinkBinTree<String> binTree = new ThreeLinkBinTree("根节点");
		//依次添加节点
		ThreeLinkBinTree.TreeNode tn1 = binTree.addNode(binTree.root()
			,  "二左" , true);
		ThreeLinkBinTree.TreeNode tn2 = binTree.addNode(binTree.root()
			, "二右" ,false );
		ThreeLinkBinTree.TreeNode tn3 = binTree.addNode(tn1 
			, "三左" , true);
		ThreeLinkBinTree.TreeNode tn4 = binTree.addNode(tn1
			, "三右" , false);
		ThreeLinkBinTree.TreeNode tn5 = binTree.addNode(tn3
			, "四右" , false);
		ThreeLinkBinTree.TreeNode tn6 = binTree.addNode(tn5
			, "五左" , true);
		ThreeLinkBinTree.TreeNode tn7 = binTree.addNode(tn5
			, "五右" , false);
		System.out.println(binTree.preIterator());
		System.out.println(binTree.inIterator());
		System.out.println(binTree.postIterator());
		System.out.println(binTree.breadthFirst());
    }
}
分享到:
评论

相关推荐

    java 数据结构code

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

    HuffmanCode_java.rar_HuffmanCode_java_huffman java_huffman 文本_hu

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

    Java二叉树路径和代码示例

    Java二叉树路径和代码示例是 Java 编程中的一种常见问题,该问题主要涉及到二叉树的遍历和路径搜索。给定一个二叉树,找出所有路径中各节点相加总和等于给定目标值的路径。 二叉树是一种基本的数据结构,它由节点...

    Java_Programming_classic_tree_parameter_code.rar_java programmin

    本资源“Java_Programming_classic_tree_parameter_code.rar”包含了一个名为“Java编程开发树参数经典代码.java”的文件,它很可能包含了实现树结构及其操作的示例代码。下面我们将深入探讨树数据结构的基本概念、...

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

    在Java中实现哈夫曼编码,可以创建一个`Node`类表示二叉树节点,包含字符、频率和左右子节点。使用`PriorityQueue`来构建哈夫曼树,然后遍历树生成编码。例如,`Exam7_4.java`可能是实现这个过程的源代码文件。 ...

    HaffmanCode.rar_java 哈夫曼_压缩 解压 java_哈夫曼 编码_哈夫曼压缩

    3. **文件压缩**:在得到哈夫曼编码后,可以将原始文件中的每个字符替换为它的哈夫曼编码,形成压缩后的文件。此外,还需要保存哈夫曼树的信息,以便解压时重建哈夫曼树,这是必要的因为压缩文件中不包含原始字符...

    HuffmanCode_huffman编码java_huffman_

    在`HuffmanCode`这个项目中,我们可能会看到以下文件结构和代码: 1. `CharacterFrequency.java`:定义`CharacterFrequency`类。 2. `HuffmanNode.java`:定义`HuffmanNode`类。 3. `HuffmanTree.java`:定义`...

    HaffmanCode.rar_huffman_huffman编码java

    5. **HaffmanCode.txt文件**:在这个案例中,`HaffmanCode.txt`文件很可能包含了经过哈夫曼编码处理后的文本,或者可能是记录了字符频率、哈夫曼树结构或编码信息的数据。 实现哈夫曼编码的Java程序通常会包括以下...

    java 数据压缩的实现示例

    在实现数据压缩时,我们通常会先构建哈夫曼树,然后按照从根到叶的顺序遍历,生成哈夫曼编码。编码后的数据再进行位操作,打包成字节流。解压缩时,首先根据预先保存的哈夫曼树信息重建树,然后按照字节流解码,恢复...

    Java程序

    - **深度优先遍历(Depth-First Traversal)**: 在构建哈夫曼树后,使用深度优先遍历的方式来遍历树并记录每个字符的哈夫曼编码。在示例代码中,通过 `preorder()` 方法实现了深度优先遍历的过程。 ### 4. 具体实现...

    Java各种排序算法代码.zip

    下面将详细讨论这些算法及其在Java中的实现。 1. 冒泡排序(Bubble Sort): 冒泡排序是最简单的排序算法之一,通过重复遍历待排序的元素列表,比较相邻元素并交换位置,直至列表排序完成。在Java中,冒泡排序通常...

    huffman编码java实现

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

    java 哈夫曼编码实现翻译

    为了实现题目中给出的“this program is my favorite”报文的编码和译码,我们需要先计算每个字符的出现频率,然后构建哈夫曼树,生成编码,最后对报文进行编码和解码。编码是将每个字符替换为其哈夫曼编码,解码则...

    基于Huffman编码压缩软件(java实现)

    `HuffmanCode.java`则负责生成Huffman编码,这通常通过遍历Huffman树并跟踪从根节点到每个叶子节点的路径来完成。每条路径可以被映射到一个唯一的二进制码,形成字符与编码的对应关系。 `CompressFrame.java`和`...

    java_code.zip_构建数组的最大MaxTree

    这棵树的根节点是数组中的最大值,其左子树是数组中除去最大值后的剩余元素构建的最大MaxTree,右子树同理。这种结构允许我们快速地查询任意区间内的最大值。 首先,我们来深入理解MaxTree的概念。假设我们有一个...

    Code-for-binary-tree.zip_tree

    "Code for binary tree"这个压缩包可能包含了用不同编程语言实现的二叉树操作代码,比如插入、删除、搜索和遍历等操作。常见的编程语言如C++、Java、Python等都有相应的二叉树数据结构实现。通过阅读和理解这些代码...

    JAVA压缩文件代码

    在Java编程语言中,压缩文件是一项常见的任务,用于减少文件的存储空间,提高传输效率。HUFFMAN编码是一种数据压缩算法,它基于字符频率构建一棵最优的二叉树来进行编码,广泛应用于文本压缩。本节将详细介绍如何在...

    哈夫曼压缩与解压缩程序(JAVA)

    4. **BitOutputStream.java**:此类用于处理位级别的输出,即写入哈夫曼编码后的位流。在Java中,通常使用BitSet或自定义数据结构来存储和管理位,然后将其写入OutputStream,如FileOutputStream。 5. **...

    Java版 赫夫曼编码计算程序

    Java版的赫夫曼编码计算程序是一个用于数据压缩的实用工具,它基于赫夫曼树(也称为最优二叉树)...通过阅读和分析`HuffmanCode.java`的源代码,我们可以学习到如何在Java中实现这些概念,并进一步提升我们的编程能力。

    leetcode1-240题中文题解,md格式,java

    标题中的"leetcode1-240题中文题解,md格式,java"表明这是一个关于LeetCode编程挑战的资源集合,涵盖了从第1题到第240题的解决方案,主要以Markdown格式的文本文件呈现,并且所有的解决方案都是用Java语言编写的。...

Global site tag (gtag.js) - Google Analytics