`
五月天
  • 浏览: 21279 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

二叉树

阅读更多

大家都知道,要对一个对象进行排序可以利用java提供的Comparable<T>接口和Arrays工具类实现。

在实现Comparable<T>接口时要实现下面的方法

public int compareTo(T t);

 此方法返回1,0和-1。返回1表示升序,-1表示降序。0表示相等。

为什么要这样定义?出于好奇,我查看了源代码,发现此方法是利用了数据结构里面的平衡二叉树的排序原理。

为了巩固以前学过的数据结构知识,我现在通过java来实现下Binary Tree.

/**
 * 二叉树
 */
public class BinaryTree<T> {
	//树的节点
	public class Node {
		//节点上的数据
		Comparable<T> data;
		//左子树
		Node lChild;
		//右子树
		Node rChild;
		
		public Node(Comparable<T> data) {
			this.data = data;
		}
		//添加一个节点
		@SuppressWarnings("unchecked")
		public void addNode(Node node) {
			//若当前节点的数据比添加的节点的数据大,则将新节点放在此节点的左子树上
			if (this.data.compareTo((T)node.data) == 1) {
				//若当前节点的左子树为空,则直接创建新节点,放在其左子树上
				if (this.lChild == null) {
					this.lChild = node;
				} else {
					//递归调用
					this.lChild.addNode(node);
				}				
			} else { //新节点的数据大于等于当前节点的数据,则将其放到当前节点的右子树上
				if (this.rChild == null) {
					this.rChild = node;
				} else {
					this.rChild.addNode(node);
				}
			}
		}
		//中序遍历打印出当前节点为根的所有子节点
		public void printNode() {
			if (this.lChild != null) { //先遍历左子树
				this.lChild.printNode();
			}
			System.out.print(this.data + " "); //打印根节点
			if (this.rChild != null) { //再遍历右子树
				this.rChild.printNode();
			}
		}
	}
	//根节点
	private Node root;
	
	//添加新节点
	public void addNode(Node node) {
		if (root == null) {
			root = node;
		} else {
			root.addNode(node);
		}
	}
	//打印树
	public void printTree() {
		root.printNode();
	}
	
	//测试类
	public static class Test {
		public static void main(String[] args) {
			BinaryTree<Integer> tree = new BinaryTree<Integer>();
			tree.addNode(tree.new Node(1));
			tree.addNode(tree.new Node(10));
			tree.addNode(tree.new Node(13));
			tree.addNode(tree.new Node(111));
			tree.addNode(tree.new Node(32));
			tree.addNode(tree.new Node(19));
			tree.addNode(tree.new Node(1));
			tree.printTree();
		}
	}
}

打印出:

1 1 10 13 19 32 111 

 测试成功! 

总结:

返回1表示当前节点大于新添加的节点,因此要把新添加的节点放在当前节点的左子树上,反之加到当前节点的右子树上。

然后利用二叉树的中序遍历(先左子树,再根,再右子树)得到排序结果。这也就说明了comparaTo方法返回的-1,0和1的原因。

 

分享到:
评论
3 楼 yangguo 2010-07-28  
1.确实是二叉树。不是平衡。
2.跟comparaTo返回什么没有什么关系。
2 楼 五月天 2010-05-11  
DAOException 写道
你这只是二叉树吧,不是平衡二叉树

这是平衡二叉树啊~别悠闲我:wink:
1 楼 DAOException 2010-05-07  
你这只是二叉树吧,不是平衡二叉树

相关推荐

    二叉树建立 二叉树基本算法的实现

    (2)先序、中序、后序遍历二叉树:递归算法。 (3)中序遍历二叉树:非递归算法(最好也能实现先序,后序非递归算法)。 (4)求二叉树的高度 。 (5)求二叉树的叶子个数。 (6)对于树中每一个元素值为x的结点...

    按凹入表形式横向打印任意二叉树结构,即二叉树的根在屏幕的最左边,二叉树的左子树在屏幕的下边,二叉树的右子树在屏幕的上边。

    二叉树横向打印算法的实现 二叉树是一种基本的数据结构,在计算机科学和编程中广泛应用。本资源介绍了一种特殊的二叉树打印算法,即横向打印二叉树结构。该算法将二叉树的根节点放在屏幕的最左边,左子树在屏幕的...

    二叉树的基本运算

    建立一棵二叉树,试编程实现二叉树的如下基本操作: 1. 按先序序列构造一棵二叉链表表示的二叉树T; 2. 对这棵二叉树进行遍历:先序、中序、后序以及层次遍历,分别输出结点的遍历序列; 3. 求二叉树的深度/结点数目...

    二叉树相关算法的实验验证+判别给定二叉树是否为完全二叉树。

    1、 定义链接存储的二叉树类。 2、 实验验证如下算法的正确性、各种功能及指标: 1) 创建一棵二叉树,并对其初始化; 2)先根、中根、后根遍历二叉树; 3) 在二叉树中搜索给定结点的父结点; 4) 搜索二叉树中符合...

    二叉树_二叉树遍历_

    1.二叉树的基本操作实现【问题描述】建立一棵二叉树,用递归方法实现二叉树的如下基本操作:(1)按先序序列构造一棵二叉链表表示的二叉树T;(2)对这棵二叉树进行遍历:先序、中序、后序以及层次遍历,分别输出...

    二叉树课程设计的实验报告

    3 程序所能达到的功能:生成一个新的二叉树,实现对二叉树的先序,中序,后序和层次遍历,计算二叉树的深度,结点数,叶结点数,。 4 测式数据: A生成一个新的二叉树后,直接在键盘上按要求输入字符,可以依次输入...

    数据结构试验3二叉树建立,遍历等

    数据结构试验3二叉树建立,遍历等操作代码及运行结果。 实验内容: 采用二叉链表存储,实现二叉树的创建、遍历(递归)、赫夫曼编码和译码等典型操作。 1. 编程实现如下功能: (1)假设二叉树的结点值是字符型,...

    二叉树的建立及遍历

    如果给出了遍历二叉树的前序序列和中序序列,则可以构造出唯一的一棵二叉树。试编写实现上述功能的程序。 [基本要求] 已知一棵二叉树的前序和中序序列,试设计完成下列任务的一个算法: (1)构造一棵二叉树...

    数据结构 树和二叉树ppt教程

    详细的树和二叉树的教程,还附有源代码 部分代码如下: 二叉树头文件.h //二叉树的二叉链表存储表示 typedef struct BiTNode {TElemType data; //二叉树结点数据域 struct BiTNode *lchild,*rchild; //左右孩子指针...

    数据结构--二叉树--思维导图.pdf

    "数据结构--二叉树--思维导图" 二叉树是一种常见的数据结构,它是一种树形结构,每个节点最多有两个孩子节点,分别是左子树和右子树。二叉树可以用来存储大量数据,并且可以快速地查找、插入和删除数据。 二叉树的...

    二叉树的建立与遍历

    按先序序列构造一棵二叉链表表示的二叉树T,并输出该T的中序遍历序列。实现提示: 1) 按先序序列建立一棵二叉树时,先构造根结点,再构造根的左子树,然后构造右子树;每棵子树又都是二叉树,所以构造一棵子树的过程...

    根据先序与中序遍历结果建立二叉树

    根据先序与中序遍历结果建立二叉树 输入为: 第一行:二叉树的先序遍历结果 第二行:二叉树的中序遍历结果 例如: ①输入aa则返回的指针指向的二叉树应该就是仅有一个节点,值为a. ②输入123213则返回的指针指向...

    数据结构实验-二叉树的基本操作

    运用二叉链表实现二叉树的基本操作,包括:创建二叉树的存储结构、复制已有的二叉树、计算已有的二叉树的深度、先根序序列、中根序序列、后根序序列等。 输入格式:AB#C##D## 二、实验目的 掌握二叉链表及二叉树的...

    数据结构实验——二叉树的建立和遍历.zip

    1.采用二叉链表作为存储结构,创建一棵二叉树; 2.用递归及非递归算法对二叉树实现先序遍历; 3.用递归及非递归算法对二叉树实现中序遍历; 4.用递归及非递归算法对二叉树实现后序遍历。 5.用递归遍历算法中的访问...

    二叉树的建立与基本操作

    编写程序实现二叉树的如下操作: 1) 建立二叉链表 2) 二叉树的先序、中序、后序遍历 3) 求解二叉树的叶子结点个数 4) 将二叉树中所有结点的左、右子树相互交换 输入:  扩展二叉树先序序列:ab#d##ce###。其中#...

    数据结构——二叉树有关操作程序

    一)建立二叉树+判空+遍历 (1)以二叉链表作为存储结构,从键盘以先序次序输入各个结点(空格字符表示空树)建立一棵二叉树; (2)对(1)中生成的二叉树进行判空; (3)对(1)中生成的二叉树进行遍历(分别实现...

    二叉树---数据结构

    二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树二叉树

    数据结构实验 二叉树的遍历方法

    一、实验名称:二叉树的遍历方法 二、实验目的: (1)熟悉C语言的上机环境,进一步掌握C语言的结构特点; (2)掌握二叉树的储存结构的定义及C语言实现; (3)掌握二叉树的三种遍历方法,即先序遍历,中序遍历,...

    C++ 数据库二叉树的实现

    4.掌握计算二叉树的结点个数、二叉树的深度、二叉树的叶子结点和二叉树复制算法。 二、实验内容 1、构造基于先序遍历的二叉链表。 要求:按先序遍历规则,从键盘连续输入二叉树的先序序列,若无孩子结点,则用#代替...

    数据结构二叉树实验头文件

    在计算机科学中,二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。 一棵深度为k,且有2^k-1个结点的...

Global site tag (gtag.js) - Google Analytics