`
marcoSpring
  • 浏览: 33151 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java 二叉搜索树(搜索、添加、遍历)

 
阅读更多
     栈、队列、链表都有他们各自的好处,同样的也有弊端的存在。
     如果我想要一个有序的数组和链表这个当然很好实现。现在我要在这几个数据结构中查找一个值。先说数组,因为是有序的通过二分查找很快的就可以找到。查找的效率还是很高的,但如果要是插入呢,为了保证有序,我要先找到插入位置,然后再将比插入数字大的数字依次向后移动;这时的第一反应就是链表!他打插入速度很快,只要改变指针的指向就可以了。但是链表大查找要从头开始找啊。只有知道了前一个元素的地址才能知道下一个地址。所以链表查找起来又费劲了。这时候就有人引进了树。
    树也分很多种,只说特殊的二叉树中的二叉搜索树。
    二叉搜索树定义:一个节点的左子节点的关键自值小于这个节点,右子节点的关键字值大于或等于这个父节点。
    二叉搜索树插入的时候可以直接改变左树右树的指针指向,查找的时候可以根据排序二叉树的特点。
    这就是一个二叉搜索树

    现在开始用代码来描述这棵树。先看节点类
   
package test; 
/** 
 * @author 作者 MarcoSpring 
 * @version 创建时间:2012-8-3 上午10:13:13 
 * 树节点类 
 */
public class TreeNode {
	public int keyValue;    //关键字值
	public TreeNode leftNode;//左节点
	public TreeNode rightNode;//右节点
	
	public TreeNode(){}
	public TreeNode(int Key){
		this.keyValue = Key;
	}
}

代码不多,描述了一个节点的内容。关于二叉搜索树的描述主要从查询节点、添加节点、遍历、最大值、最小值、删除节点来描述。这里不包括存在相等节点的情况。
查询节点:这个比较简单,根据二叉树的定义查询就可以了。看图写代码最方便,

再看代码
public TreeNode search(int Key) {
		TreeNode node = root;
		// 首先定义一个节点让其指向根,在下面的循环中
		// 只要节点值不等于要查找的节点值就进入循环如果没有找到则返回null
		while (node.keyValue != Key) {
			if (Key < node.keyValue) { // 如果要查找的值小于节点值则指向左节点
				node = node.leftNode;
			} else { // 否则指向右节点
				node = node.rightNode;
			}
			if (node == null) { // 如果节点为空了则返回null
				return null;
			}
		}
		return node;
	}

添加节点,添加节点的过程是现搜索再添加。先看图

再看代码
public void insert(int Key) {
		TreeNode node = new TreeNode(Key);
		// 添加节点之前首先要找到要添加的位置,这样就要记住要添加节点的父节点
		// 让父节点的左右指向要添加的节点
		if (root == null) { // 如果根结点为空,则根节点指向新节点
			root = node;
		} else {
			TreeNode currentNode = root;// 定义当前节点并指向根节点
			TreeNode parentNode;
			while (true) { // 寻找节点添加的位置
				parentNode = currentNode;
				if (Key < currentNode.keyValue) {
					currentNode = currentNode.leftNode;
					if (currentNode == null) { // 当找到空节点的时候,父节点的左节点指向新节点
						parentNode.leftNode = node;
						return;
					}
				} else {
					currentNode = currentNode.rightNode;
					if (currentNode == null) { // 当找到空节点的时候,父节点的右节点指向新节点
						parentNode.rightNode = node;
						return;
					}
				}
			}
		}
	}


遍历树:遍历分为中序遍历(最常用,也最有用),前序遍历,后续遍历。
这里就发一个中序遍历的图,理解了这个前序和后续都很好理解。

再看代码
public void display(TreeNode node) {
		if (node != null) {
			display(node.leftNode);
			System.out.println(node.keyValue + ",");
			display(node.rightNode);
		}
	}


最大值、最小值:这个就不用说了,最大值一直往右走,最小值一直往左走。
直接上代码:
	public int max() {
		TreeNode node = root;
		TreeNode parent = null;
		while (node != null) {
			parent = node;
			node = node.rightNode;
		}
		return parent.keyValue;
	}

	
	public int min() {
		TreeNode node = root;
		TreeNode parent = null;
		while (node != null) {
			parent = node;
			node = node.leftNode;
		}
		return parent.keyValue;
	}

关于删除节点单独发一篇,因为实在太麻烦了。。。
  • 大小: 106.1 KB
  • 大小: 108.1 KB
  • 大小: 90.7 KB
  • 大小: 92.7 KB
分享到:
评论
1 楼 cuisuqiang 2012-08-07  
非常好,坚决学习!

相关推荐

    java基础面试题二叉搜索树的后续遍历序列

    java基础面试题二叉搜索树的后续遍历序列本资源系百度网盘分享地址

    二叉搜索树的源码,加上注释和自己理解

    `BST.java`很可能是二叉搜索树的实现,`TreeDoc.java`可能包含了关于数据结构或树操作的文档,而`BSTMain.java`应该是主程序,用于测试和展示二叉搜索树的功能。 在`BST.java`中,二叉搜索树的节点可能包含以下属性...

    二叉搜索树

    4. **遍历二叉搜索树**:主要有三种遍历方式:前序遍历、中序遍历和后序遍历。 - **前序遍历**:先访问根节点,再遍历左子树,最后遍历右子树。 ```java void preOrder(Node node) { if (node != null) { ...

    java-leetcode题解之第98题验证二叉搜索树.zip

    这个“java-leetcode题解之第98题验证二叉搜索树.zip”压缩包文件显然是针对LeetCode上的第98题提供的Java解决方案。这道题目涉及的核心知识点是二叉搜索树(Binary Search Tree, BST)和树的遍历。 **二叉搜索树**...

    二叉搜索树 转为 双向链表,

    而将一个二叉搜索树转换为双向链表,可以进一步优化某些操作,如顺序遍历,因为链表提供了连续的访问方式。 双向链表(Doubly Linked List)是一种线性数据结构,其中每个节点包含数据和两个指针,分别指向其前一个...

    LeetCode精选TOP面试题108.将有序数组转换为二叉搜索树

    将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 将有序数组转换为二叉搜索树的结果肯定是不唯一的,因为存在...

    Java实现 LeetCode 530 二叉搜索树的最小绝对差(遍历树)

    在本题中,我们需要解决的是 LeetCode 530 题目——“二叉搜索树的最小绝对差”。这是一道与数据结构和算法相关的编程问题,涉及到二叉搜索树(BST)以及树的遍历。二叉搜索树是一种特殊的二叉树,其每个节点的左...

    Java二叉搜索树基础原理与实现方法详解

    Java二叉搜索树基础原理与实现方法详解 本文详细介绍了Java二叉搜索树的基础原理与实现方法,涵盖了二叉树的定义、特点、二叉搜索树的定义、性质、思想、编程实现等方面的知识点。 一、树的定义 树是n(n&gt;=0)个...

    Java 实现二叉搜索树的查找、插入、删除、遍历

    以下是Java实现二叉搜索树的查找、插入、删除和遍历的关键点: 1. **查找节点**: - 查找操作基于二叉搜索树的性质,从根节点开始,如果目标键值小于当前节点的键值,就向左子树移动;如果目标键值大于当前节点的...

    java课程设计二叉排序树

    二叉排序树(Binary Sort Tree,BST),也称为二叉查找树或有序二叉树,是一种自平衡的二叉树数据结构,它在处理搜索、插入和删除操作时具有较高的效率。在Java中,我们可以利用面向对象编程的概念来实现二叉排序树...

    Java二叉搜索树遍历操作详解【前序、中序、后序、层次、广度优先遍历】

    "Java二叉搜索树遍历操作详解【前序、中序、后序、层次、广度优先遍历】" Java二叉搜索树是一种常用的数据结构,遍历操作是其核心内容。Java二叉搜索树遍历操作可以分为五种:前序遍历、中序遍历、后序遍历、层次...

    红黑树、二叉平衡树、二叉排序树的java实现

    其次,二叉平衡树(AVL树)是最早被提出的自平衡二叉搜索树,由G. M. Adelson-Velsky和E. M. Landis于1962年提出。AVL树要求每个节点的两个子树的高度差不超过1,以确保树的高度保持在log2(n+1)的范围内。为了维持这...

    Java基于二叉查找树实现排序功能示例

    本文主要介绍了Java基于二叉查找树实现排序功能的示例,通过实例形式分析了Java二叉查找树的定义、遍历及排序等相关操作技巧。下面将对这些知识点进行详细的解释和分析。 一、Java二叉查找树的定义 Java二叉查找树...

    二叉搜索树练习 HDU3791

    5. **遍历操作**:二叉搜索树常见的遍历方式有前序遍历(根-左-右)、中序遍历(左-根-右)和后序遍历(左-右-根)。其中,中序遍历的结果是有序序列。 在题目"二叉搜索树练习 HDU3791"中,可能涉及的是对二叉搜索...

    java-leetcode题解之第173题二叉搜索树迭代器.zip

    总之,这个压缩包中的Java代码提供了对LeetCode第173题的解决方案,涉及到了二叉搜索树的遍历和迭代器设计。理解并实现这个迭代器有助于加深对二叉搜索树和迭代器模式的理解,对于提升Java编程技能和解决算法问题的...

    tree-java.rar_tree_二叉搜索树

    在Java中实现二叉搜索树,我们需要定义一个`Node`类来表示树的节点,通常包括键、值、左子节点和右子节点。接着,我们需要一个`BinarySearchTree`类来操作这些节点,包含插入、查找、删除等基本操作。 例如,在`src...

    二叉查找树java

    以上就是关于二叉查找树在Java中的基本实现,包括插入、删除、遍历和查询等操作。通过这些操作,我们可以高效地管理一组有序数据,并进行各种数据操作。二叉查找树在实际应用中广泛用于数据库索引、文件系统以及各种...

    二叉搜索树迭代器(java代码).docx

    二叉搜索树迭代器的主要目的是提供一种能够遍历二叉搜索树中所有节点的方法,通常按照某种顺序进行访问,如中序遍历(In-order Traversal)可以得到升序排序的结果。 #### 1. 数据结构选择 - **栈**:本例中使用了`...

    二叉搜索树代码.zip

    常见的编程语言如C++、Java、Python都有库支持二叉搜索树的实现。 总的来说,二叉搜索树是一种高效的数据结构,能够快速地执行查找、插入和删除操作,适用于需要频繁进行这些操作的场景。理解并熟练掌握二叉搜索树...

Global site tag (gtag.js) - Google Analytics