`
新建文件夹.zip
  • 浏览: 6747 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
最近访客 更多访客>>
社区版块
存档分类
最新评论

数据结构之二叉搜索树

阅读更多

       我勒个去啊。。。刚刚好不容易写了一篇博客,怎么突然就不见了。。只要再写一遍了。。它这个自动保存草稿真是坑爹啊。。受不鸟了。。。

       这学期开了数据结构的课,刚刚上完树,正好在蓝杰也学到了树,今天,就实现下二叉搜索树。

       所谓二叉搜索树,它的最主要特征就是对于任意一个节点X,它的所有的左子树上存放的关键字一定比X的关键字要小,而右子树上存放的则比X的要大。正是由于这种特性,使得我们在查找的时候特别容易,时间复杂度大概是O(log N)。下图就是一个二叉搜索树。



 首先,定义一个节点类。

/*
 * 定义一个二叉树的节点类
 */
public class Node {
	
	int data;
	Node root;
	Node right_child;
	Node left_child;
	Node parent;
	int position;
	
	public Node(int data){
		this.data = data;
	}
}

 实现的方法如下:

1、MakeEmpty

       这个方法用于将树初始化。

/*
	 *将一棵二叉树置为空树的方法
	 */
	public void MakeEmpty(Node root){
		if(root != null){
			MakeEmpty(root.right_child);
			MakeEmpty(root.left_child);
			root = null;
		}
		System.out.println("该树为空树!");
	}

 2、Find

        这个方法用来查找某一元素,需要传入你所要查找的元素以及一个树的根节点作为参数。因为二叉搜索树的特点,查找是一件非常容易的事。

/*
	 * 在一棵二叉搜索树中查找某一元素的方法
	 */
	public Node Find(int x, Node root){
		if(root == null){
			System.out.println("该树为空树!");
			return null;
		}
		if(x < root.data){
			return Find(x, root.left_child);
		}else if(x > root.data){
			return Find(x, root.right_child);
		}
		else
			return root;
	}

 3、FindMin 和 FindMax

        分别用于查找最小和最大的元素。需要传入一个树的根节点作为参数。对于FindMin只需要一直查找它的左节点直到为空即可,FindMax则只需要查找右节点。这里运用了递归和非递归两种方法来实现。

/*
	 *在一棵二叉搜索树中查找最小的元素的方法(递归实现)
	 */
	public Node FindMin(Node root){
		if(root == null){
			System.out.println("该树为空树!");
			return null;
		}
		else if(root.left_child == null){
			return root;
		}else
			return FindMin(root.left_child);
	}
	
	/*
	 * 在一棵二叉搜索树中查找最大元撒的方法(非递归实现)
	 * 从根节点开始,一直查找它的右子树,直到最后一层
	 */
	public Node FindMax(Node root){
		Node node = root;
		
		if(root == null){
			System.out.println("该树为空!");
			return null;
		}
		else{
			while(node.right_child != null){
				node = node.right_child;
			}
		
			return node;
		}
	}

 4、Insert

       插入的方法在概念上简单的,需要传入你所要插入的元素及根节点作为参数。对于要插入的元素,判断它和节点之间的关系,直到找到它的位置。比如对于上图所示的树,我们需要插入一个新的元素“5”,首先判断它和根节点的关系,应该存放在左子树上,再判断它和“2”的关系,应该存放在有子树上,再判断和“4”的关系,应该存放在右子树上,而“4”的右子树为空,于是我们就找到了存放它的位置。

/*
	 * 向一棵二叉搜索树中添加元素的方法 
	 */
	public Node Insert(int x, Node root){
		Node node = new Node(x);
		
		if(root == null){
			root = node;
			return root;
		}else{
			Node current_node = root;
			Node parent_node;
			while(true){
				parent_node = current_node;
				if(x < current_node.data){
					current_node = current_node.left_child;
					if(current_node == null){
						parent_node.left_child = node;
						return root;
					}
				}else{
					current_node = current_node.right_child;
					if(current_node == null){
						parent_node.right_child = node;
						return root;
					}
				}
			}
		}
	}

 5、Delete

        喜闻乐见的又到了删除的时候,需要传入你所要删除的元素已经树的根节点作为参数。二叉搜索树的删除是比较复杂的。它可能会遇到三种情况,第一种是要删除的节点没有子节点,这无疑是最简单的一种。第二种是它由一个子节点,这种情况也是比较简单的,只需要记下要删除的节点的父节点即可。第三种是要删除的节点有两个子节点,这时候我采取的策略是用要删除的节点的右子树上存放元素最小的节点来代替你所要删除的节点。

	/*
	 * 删除二叉搜索树中的一个元素
	 */
	public Node Delete(int x, Node root){
		Node node = root;
		Node node1 =  Find(x, root);
		if(node1 == null){
			System.out.println("要删除的元素不存在!");
		}else if((node1.right_child != null) && (node1.left_child != null)){
			//判断要删除的节点是否有两个子节点
			//如果有两个子节点,则该用该节点的右子树的最小元素的子节点来代替该节点
			//判断要删除的及节点是它的父节点的左节点还是右节点
			if(node1.data < node1.parent.data){//左节点
				node1.parent.left_child = FindMin(node1.right_child);
				FindMin(node1.right_child).parent = node1.parent;
			}else{
				node1.parent.right_child = FindMin(node1.right_child);
				FindMin(node1.right_child).parent = node1.parent;
			}
			FindMin(node1.right_child).left_child = node1.left_child;
			node1.left_child.parent = FindMin(node1.right_child);
			
			
		}else{
			//如果要删除的节点只有一个子节点,则让它的父节点指向它的子节点
			if(node1.data < node1.parent.data){//左节点
				if(node1.left_child == null){
					node1.parent.left_child = node1.right_child;
					node1.right_child.parent = node1.parent;
				}else{
					node1.parent.left_child = node1.left_child;
					node1.left_child.parent = node1.parent;
				}
			}else{
				if(node1.left_child == null){
					node1.parent.left_child = node1.right_child;
					node1.right_child.parent = node1.parent;
				}else{
					node1.parent.left_child = node1.left_child;
					node1.left_child.parent = node1.parent;
				}
			}		
		}
		return root;
	}

 6、PrintTree

       遍历二叉搜索树将其打印。需要传入根节点作为参数。这里用的是中序遍历的方法。

	/*
	 * 遍历打印二叉搜索树
	 */
	public void PrintTree(Node root){
		Node node = root;
		if(node.left_child != null){
			PrintTree(node.left_child);
		}
		System.out.println(node.data);
		if(node.right_child != null){
			PrintTree(node.right_child);
		}
	}

 

      

  • 大小: 5.7 KB
分享到:
评论

相关推荐

    数据结构之二叉排序树的生成

    二叉排序树,又称二叉查找树或二叉搜索树,是一种特殊的数据结构,它具有以下特性:对于树中的任意节点,其左子树中的所有节点的值都小于该节点的值,而右子树中所有节点的值都大于该节点的值。这种特性使得在二叉...

    数据结构之二叉排序树

    二叉排序树,又称二叉查找树或二叉搜索树,是数据结构中的一种重要类型,主要用于高效地存储和检索数据。它具有以下关键特性: 1. **定义**:二叉排序树是一种特殊的二叉树,其中每个节点的左子树只包含比该节点小...

    数据结构 二叉搜索树

    二叉搜索树(Binary Search Tree,BST)是数据结构中的一种特殊类型,它是一种二叉树,具有以下特性: 1. 每个节点都包含一个键(key)、一个关联的值、一个指向左子节点的引用和一个指向右子节点的引用。 2. 节点...

    陈越、何钦铭-数据结构作业8:二叉搜索树的操作集

    函数Insert将X插入二叉搜索树BST并返回结果树的根结点指针; 函数Delete将X从二叉搜索树BST中删除,并返回结果树的根结点指针;如果X不在树中,则打印一行Not Found并返回原树的根结点指针; 函数Find在二叉搜索树...

    数据结构实验之二叉排序树

    动态查找是指在数据结构中搜索特定值的过程,对于二叉排序树,这个过程通常从根节点开始,如果目标值小于当前节点,则在左子树中继续查找;如果目标值大于当前节点,则在右子树中查找,直到找到目标值或遍历完所有...

    数据结构(二叉平衡排序树)课程设计报告

    二叉平衡排序树,顾名思义,是一种保持平衡的二叉搜索树。传统的二叉搜索树在插入和删除操作后可能会导致树的高度极度不平衡,从而影响查找效率。然而,二叉平衡排序树通过特定的结构调整策略,确保了树的左右子树...

    数据结构二叉排序树的源代码

    二叉排序树(Binary Search Tree, BST),又称为二叉查找树或有序二叉树,是一种特殊的二叉树数据结构。它具有以下性质: 1. 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 2. 若任意节点...

    陈越、何钦铭-数据结构作业12:是否同一棵二叉搜索树

    给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的...

    最优二叉搜索树

    这种数据结构主要用于提高查询效率,在某些特定操作序列下,它能比普通二叉搜索树表现出更好的性能。 二叉搜索树(BST)是一种特殊的二叉树,其中每个节点都包含一个键值,且满足以下条件: 1. 左子树中所有节点的...

    基于二叉搜索树实现的电话簿程序

    在计算机科学中,数据结构是存储和组织数据的关键方式,而二叉搜索树(Binary Search Tree,BST)作为一种特殊的数据结构,因其高效的操作性能在各种实际应用中得到广泛使用。本程序正是利用了二叉搜索树的特性,...

    数据结构___二叉排序树

    一、实验目的 (1)理解动态查找表的动态生成过程; (2)任意给出一组数(不...(1)定义二叉排序树的数据结构; (2)实现二叉排序树的插入算法与查找算法,并建立二叉排序树; (3)进行数据查找和建树过程的比较。

    C++二叉搜索树的插入和删除例子

    通过阅读和分析代码,你可以更深入地了解二叉搜索树的内部工作原理,这对于学习数据结构和算法非常有帮助。同时,动手实践这些操作,比如编写测试用例来验证插入和删除功能,也是提高编程技能的好方法。

    javascript数据结构之二叉搜索树实现方法

    主要介绍了javascript数据结构之二叉搜索树实现方法,较为详细的分析了二叉搜索树的概念、原理与JavaScript实现二叉搜索树的方法,对于学习JavaScript数据结构具有一定参考借鉴价值,需要的朋友可以参考下

    基于C语言的数据结构-二叉搜索树bitTree

    二叉搜索树(Binary Search Tree,BST),也称为二叉排序树,是计算机科学中用于组织数据的一种数据结构。在二叉搜索树中,每个节点包含一个键(key)、一个关联的值、一个指向左子节点的引用以及一个指向右子节点的...

    二叉搜索树算法(共两个PPT)

    二叉搜索树(Binary Search Tree,BST),是数据结构领域中的一个重要概念,它是一种特殊的二叉树,每个节点的左子树只包含比其小的元素,而右子树则包含大于它的元素。这种特性使得二叉搜索树在查找、插入和删除...

    增强二叉搜索树

    增强二叉搜索树,也称为动态二叉搜索树或自平衡二叉搜索树,是一种在普通二叉搜索树基础上增加了额外特性的数据结构。在普通的二叉搜索树中,每个节点包含一个键值(key)以及指向左子树和右子树的指针,同时还保证...

    acm二叉搜索树参考代码

    ACM(International Collegiate Programming Contest,国际大学生程序设计竞赛)中的题目通常涉及到算法和数据结构的应用,二叉搜索树是其中常见的工具之一。本压缩包“acm二叉搜索树参考代码”可能包含了几种不同的...

    数据结构课程设计二叉搜索树

    用二叉链表作存储结构。 要求: (1)以回车(0)为输入结束标志,输入数列L,生成一棵二叉排序树T; (2)对二叉排序树T作中序遍历,输出结果; (3)计算二叉排序树T查找成功的平均查找长度,输出结果; (4)输入元素x,查找...

    数据结构课程设计二叉排序树的实现

    然而,二叉排序树的效率高度依赖于树的平衡性,因此实际应用中可能需要考虑使用自平衡二叉搜索树,如AVL树或红黑树。 #### 五、实验总结与改进 通过对二叉排序树的学习和实践,我们可以得出以下结论: 1. **二叉...

Global site tag (gtag.js) - Google Analytics