`
吃货吃货
  • 浏览: 33026 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Java数据结构(四)

    博客分类:
  • java
 
阅读更多

Java数据结构(四)

——二叉树

我们都知道数据结构时计算机存储时、组织数据的方式。数据结构是指相互之间存在一种或者多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行效率或者存储效率。而一般来说,我们常用的数据结构是:数组,栈,队列,链表,树,图,堆,散列表。这次主要就是二叉树的一点基本知识以及基本实现。

 

定义

一般的定义是二叉树是由n(n>=0)个结点构成的,每个结点最多只有两个子树的有序树。而在图论中是这么定义的:二叉树是一个连通的无环图,并且每一个顶点的度不大于3,有跟二叉树还要满足根结点的度不大于2。有了根结点之后,每个顶点定义了一个唯一的父结点,和最多2个子节点。如果不考虑连通性的话,允许图中有多个连通通量,那么这样的结构,可以称之为森林。


在逻辑上二叉树有着5种基本形态:

 

 

 

(1)空二叉树,如图a所示;

(2)只有一个根结点的树,如图b所示;

(3)只有左子树,如图c所示;

(4)只有右子树,如图d所示;

(5)完全二叉树,如图e所示;

 

类型

(1)完全二叉树:设二叉树的高度为h,出第h层以外,其他各层的结点数都达到了其的最大数目,这样的二叉树就是完全二叉树。

(2)满二叉树:在一颗二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子结点都在同一层上,这样的二叉树就是满二叉树。

(3)平衡二叉树:平衡二叉树又被称为AVL树,它是一棵二叉排序树,且具有以下性质:它是一棵空树或它的左右两棵子树的高度差的绝对值不小于1,并且左右两个子树都是一棵平衡二叉树。

 

性质

(1)若规定根结点的层次是0,则一棵非空二叉树的第i层上最多有2^i(i>=0)个结点;

(2)若规定孔二叉树树的深度为-1(即根结点的深度为0),则深度为k的二叉树最大结点数是(2^(k+1))-1个;

(3)具有n个结点的完全二叉树的深度k为不超过lb(n+1)的最大整数;

(4)对于一棵非空的二叉树,如果叶结点个数为n0,度为2的结点数为n2,则有n0=n2+1;

(5)具有n个结点的完全二叉树的深度为log2(n+1);

(6)对于具有n个结点的完全二叉树,如果从上至下和从左至右的顺序对所有结点从0开始顺序编号,则对于序号为i的结点,有:

     A、如果i>0,则序号为i结点的双亲结点的序号为(i-1)/2(/表示整除);如果i=0,则序号为i的结点为根结点,无双亲结点。

     B、如果2*i+1<n,则序号为i结点的左孩子结点的序号为2*i+1;如果2*i+1>=n,则序号为i的结点无左孩子结点。

  C、如果2*i+2<n,则序号为i结点的右孩子的序号为2*i+2;如果2*i+2>=n,则序号为i的结点无右孩子结点。

 

遍历顺序

遍历是对树最基本的运算,所谓遍历二叉树,就是按照一定规则和顺序走遍二叉树的所有结点,是每个结点都被访问一次,且只访问一次。由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结点转换成一个线性序列来表示。二叉树的基本遍历方法一共有3个:

(1)前序遍历(DLR),首先访问根结点,再遍历左子树,最后遍历右子树,简称为根左右。

(2)中序遍历(LDR),首先遍历左子树,再访问根结点,最后遍历右子树,简称为左根右。

(3)后序遍历(LRD),首先遍历左子树,再遍历右子树,最后访问根结点,简称为左右根。

如图所示:

 

采用前序遍历,则输出序列为ABDCEFGH;

采用中序遍历,则输出序列为BDAFEHGC;

采用后序遍历,则输出序列为DBFHGECA;

 

二叉搜索树的实现代码:

 

package pzw.LinBinaryTree;
/**
 * 二叉树的链式存储结构实现
 * @author pzw
 *
 */
public class BinaryTree {
	
	private TreeNode root;//根结点
	
	//向树中添加元素
	public void add(int elm){
		TreeNode temp = new TreeNode();
		temp.setElm(elm);
		if(root == null){
			root = temp;
		}else{
			add(root,temp);
		}
	}
	
	private void add(TreeNode top,TreeNode temp){
		if(top.getElm() > temp.getElm()){
			//如果想要添加的结点值小于其父结点的值,就将其添加到左子树上,否则添加到右子树上
			if(top.getLeftChild() != null){
				add(top.getLeftChild(),temp);
			}else{
				top.setLeftChild(temp);
			}	
		}else{
			if(top.getRightChild() != null){
				add(top.getRightChild(),temp);
			}else{
				top.setRightChild(temp);
			}
		}
	}
	
	//删除结点subTree及其子树
	public void destroy(TreeNode subTree){
		if(subTree != null){
			destroy(subTree.getLeftChild());
			destroy(subTree.getRightChild());
			subTree = null;
		}
	}
	
	//树的前序遍历,根左右
	public void preOrder(){
		System.out.println("树的前序遍历:");
		System.out.println("root:"+root.getElm());
		preOrder(root.getLeftChild());
		preOrder(root.getRightChild());
	}
	private void preOrder(TreeNode temp){
		if(temp != null){
			System.out.println("temp:"+temp.getElm());
			preOrder(temp.getLeftChild());
			preOrder(temp.getRightChild());
		}
	}
	
	//树的中序遍历,左根右
	public void InOrder(){
		System.out.println("树的中序遍历:");
		InOrder(root.getLeftChild());
		System.out.println("root:"+root.getElm());
		InOrder(root.getRightChild());
	}
	private void InOrder(TreeNode temp){
		if(temp != null){	
			InOrder(temp.getLeftChild());
			System.out.println("temp:"+temp.getElm());
			InOrder(temp.getRightChild());
		}
	}
	
	//树的后序遍历
	public void PostOrder(){
		System.out.println("树的后序遍历:");
		PostOrder(root.getLeftChild());
		PostOrder(root.getRightChild());
		System.out.println("root:"+root.getElm());
	}
	private void PostOrder(TreeNode temp){
		if(temp != null){	
			PostOrder(temp.getLeftChild());
			PostOrder(temp.getRightChild());
			System.out.println("temp:"+temp.getElm());
		}
	}
}

 

  • 大小: 12.8 KB
  • 大小: 13.9 KB
1
2
分享到:
评论

相关推荐

    Java数据结构和算法

    Java数据结构和算法 Java数据结构和算法 Java数据结构和算法 Java数据结构和算法 Java数据结构和算法 Java数据结构和算法 Java数据结构和算法 Java数据结构和算法

    Java 数据结构详细教程

    JavaJava 数据结构详细教程Java 数据结构详细教程Java 数据结构详细教程Java 数据结构详细教程Java 数据结构详细教程Java 数据结构详细教程Java 数据结构详细教程Java 数据结构详细教程Java 数据结构详细教程Java ...

    Java常见数据结构面试题(带答案)

    "Java常见数据结构面试题(带答案)" 以下是对Java常见数据结构面试题的知识点总结: 栈和队列 * 栈和队列的共同特点是只允许在端点处插入和删除元素。 * 栈通常采用的两种存储结构是线性存储结构和链表存储结构...

    java数据结构经典例题

    java数据结构经典例题java数据结构经典例题java数据结构经典例题java数据结构经典例题java数据结构经典例题java数据结构经典例题java数据结构经典例题java数据结构经典例题java数据结构经典例题java数据结构经典例题...

    Java数据结构课件

    Java数据结构是计算机科学中的重要课程,主要探讨如何有效地存储和组织数据,以便进行高效的操作。这门课程通常包括数组、链表、栈、队列、树、图、哈希表等多种数据结构,并深入讲解它们的特性、操作方法以及在实际...

    Java数据结构和算法.pdf

    Java数据结构和算法.pdf

    java数据结构全套

    《Java数据结构全套》是针对Java编程语言深入学习数据结构的重要资源集合,涵盖了从基本概念到高级应用的全面知识体系。这个压缩包包含了四部分关键内容:叶核亚编著的《数据结构(Java版)(第3版)》电子教案、...

    java数据结构与算法.pdf

    Java作为广泛应用的编程语言,其在实现数据结构和算法时有着丰富的库支持和优秀的可读性。下面将对标题和描述中提到的一些关键知识点进行详细解释。 1. **数据结构**: - **稀疏数组**:当大量数据中大部分为零或...

    java数据结构总结 思维导图

    java 数据结构总结的思维导图笔记,个人做的非常全,需要的自行下载

    java数据结构实例

    "Java数据结构实例"这个主题,旨在通过具体的代码实例帮助初学者掌握数据结构的基本概念和使用方式,以此来提升编程思维和问题解决能力。在这个压缩包文件中,我们可以预期找到一些用Java实现的数据结构的源代码。 ...

    java版数据结构和算法视频

    Java基础系列课程 ppt 和 源码 Java数据结构和算法第七讲.avi Java数据结构和算法第三十...Java数据结构和算法第四十四讲.avi Java数据结构和算法第四十讲.avi 第一讲.exe 第三讲.exe 第二讲.exe 第五讲.exe 第四讲.exe

    数据结构(java版本)

    《数据结构(Java版本)》这本书正是为此目的而编写,旨在将理论与实际编程相结合,通过Java语言来实现各种经典的数据结构。 首先,书中的基础部分会介绍数据结构的基本概念,如数组、链表、栈和队列。数组是最基本...

    邓俊辉版java 数据结构源码

    《邓俊辉版Java数据结构源码》是学习数据结构与算法的重要参考资料,它与邓俊辉教授编写的《Java数据结构》教材相配套,旨在帮助读者深入理解数据结构的概念和实现方法。邓俊辉教授的讲解风格清晰易懂,他的源码同样...

    数据结构JAVA实现

    在这个名为“数据结构JAVA实现”的压缩包中,我们可以看到作者提供了三种重要的数据结构——链表、有序二叉树和队列的Java代码实现。 首先,让我们详细探讨链表。链表是一种线性数据结构,与数组不同,它不连续存储...

    清华邓俊辉Java数据结构

    《清华邓俊辉Java数据结构》是一门深入探讨数据结构及其在Java编程语言中实现的课程。这门课程由清华大学的邓俊辉教授主讲,旨在帮助学生掌握数据结构的基本概念,理解它们的工作原理,并能用Java语言进行实际操作。...

    Java版数据结构(程序员必须看)

    数据结构分为四种基本类型:集合、线性结构、树型结构和图状结构。集合中的元素没有特定关系;线性结构如数组,元素间一对一关联;树型结构如文件系统,元素间存在一对多关系;图状结构则体现多对多的复杂关系。此外...

    java数据结构(老外那版,翻译的)

    《Java数据结构(老外那版,翻译的)》是一本专门为Java程序员设计的数据结构教程,它以清晰易懂的方式介绍了各种重要的数据结构概念。这本书是初学者的优秀选择,特别是对于那些偏好Java语言,不熟悉C++的人来说,...

    java数据结构测试题及答案解析.doc

    以上就是Java数据结构测试题中涉及的主要知识点,它们涵盖了数据结构、软件工程、面向对象编程和多线程等多个方面,这些都是Java开发者必备的基础知识。理解并掌握这些内容对于编写高效、安全的Java代码至关重要。

    JAVA数据结构实验报告

    这份“JAVA数据结构实验报告”很可能涵盖了数据结构的基本概念、常见类型以及它们在Java中的实现。下面我们将深入探讨相关知识点。 一、数据结构基本概念 数据结构是指一组数据的存储结构,它可以是线性的,如数组...

Global site tag (gtag.js) - Google Analytics