数据结构之二叉查找树(BST)-(六)

二叉查找树在数据结构中也经常会被用到。所谓二叉查找树就是从根节点开始,左边的节点比右边的节点小。显然BST的前序遍历就是一个从小到大的有序数组。

JAVA构建二叉查找树:

	// 构建一颗二叉查找树
		/*原理:
		 * 下一个数据和根节点比较,比根大放在根的右边,然后再跟节点的右孩子节点比较
		 * 比根节点小,则放在根节点的左侧,
		 * 如果等于根,那么不操作
		 * 注意:容易出现两种极端情形,该树全是左节点,或者全是右节点,那么平均查找时间依然是o(n),
		 * 这两种情形都不是我们想要看到的,因为BST的目的就是为了提高搜索效率
		 */
		public static TreeNode<Integer> getBSTree(int[]obj)
			{
				TreeNode<Integer>root =null;
				for (int i = 0; i < obj.length; i++)
					{
						root=insertBSTNode(root, obj[i]);
					}
				return root;
			}
		//向BST中插入一个节点
		public static TreeNode<Integer> insertBSTNode(TreeNode<Integer>root,int data)
		{
			if(root==null)
				return new TreeNode<Integer>(data);
//			TreeNode<Integer> tempNode=root;
			if(root.data<data)//大于节点值,插在节点右边
			   {
			 	 root.rightNode=insertBSTNode(root.rightNode, data);
			   }
			else if(root.data>data)//小于节点值,插在节点左边
				{
					root.leftNode=insertBSTNode(root.leftNode, data);
				}

			return root;
		}
		//根据值查找BST中相应的节点
		public static TreeNode<Integer>findBSTNode(TreeNode<Integer>root,int data)
		{
          /*//递归实现
  		    if(root==null)
				return null;
			if(root.data==data)
				return root;
			else if(root.data>data)//查找左边的
				return findBSTNode(root.leftNode, data);
			else//查找右边的
				return findBSTNode(root.rightNode, data);
			*/
			//非递归实现
			TreeNode<Integer>tempNode=root;
			while(tempNode!=null)
				{
					if(tempNode.data==data)
						return tempNode;
					else if(tempNode.data<data)
						tempNode=tempNode.rightNode;
					else
						tempNode=tempNode.leftNode;
				}
			return null;
		}
        //查找BST树中最大值,即最右边的节点
		public static int findBSTNodeMax(TreeNode<Integer>root)
		{
			/*递归实现
			if(root==null)//不存在
				return -1;
			if(root.rightNode==null)
				return root.data;
			else
				return findBSTNodeMax(root.rightNode, data);
				*/
			//非递归实现
			TreeNode<Integer>tempNode=root;
			if(tempNode!=null)
			while(tempNode.rightNode!=null)
				{
					tempNode=tempNode.rightNode;
				}
			return tempNode.data;
		}
        //查找BST树中最小值,即最左边的节点
		public static TreeNode<Integer> findBSTNodeMin(TreeNode<Integer>root)
		{
			/*递归实现
			if(root==null)//不存在
				return -1;
			if(root.leftNode==null)
				return root.data;
			else
				return findBSTNodeMin(root.leftNode, data);
				*/
			//非递归实现
			TreeNode<Integer>tempNode=root;
			if(tempNode!=null)
			while(tempNode.leftNode!=null)
				{
					tempNode=tempNode.leftNode;
				}
			return tempNode;
		}
        //向BST树中删除一个数据
		//有三种情况情况,
		//1.该节点没有子节点直接删除
		//2.该节点只有一个节点,那么直接将他的父节点和子节点相连
		//3.该节点有两个节点,那么找到他的最小的孩子节点来替换要该删除的节点,然后删除最小的孩子节点
		  //PS:该最小的孩子节点最多只有一个孩子节点
		public static void deleteBSTNode(TreeNode<Integer>root,int data)
		{
			if(root==null)
				;
			if(root.data>data)//删除左边
                 deleteBSTNode(root.leftNode, data);
			else if(root.data<data)//删除右边
				 deleteBSTNode(root.rightNode, data);
			else //开始删除了
				{
					//情形1,没有节点直接删除
					if(root.leftNode==null&&root.rightNode==null)
							root=null;
					//情形3
					else if(root.rightNode!=null&&root.leftNode!=null)
						{
						   TreeNode<Integer>tempNode=findBSTNodeMin(root);//找到最左边的节点
						   deleteBSTNode(root, tempNode.data);
						   root.data=tempNode.data;
						}
					//情形2
					else
						root=root.leftNode==null?root.rightNode:root.leftNode;

				}
		}
时间: 2024-08-02 01:26:45

数据结构之二叉查找树(BST)-(六)的相关文章

详解二叉查找树(BST)

详解二叉查找树(BST) 本篇随笔简单讲解一下数据结构--二叉查找树(\(Binary\,\,Sort\,\,Tree,BST\)),(后文的"二叉查找树"一词均用\(BST\)代替). BST的概念 首先,\(BST\)是一棵二叉树. 它的定义是,根节点左子树全部严格小于根节点,右子树大于等于根节点,并且,左右子树都是\(BST\). 很好理解,很明朗很简单的定义. 可以看出,这是一个通过递归方式定义的数据结构,所以,它的诸多操作自然要用到递归. BST的功能 我们可以看出来,这个二

二叉查找树BST 模板

二叉查找树BST 就是二叉搜索树 二叉排序树. 就是满足 左儿子<父节点<右儿子 的一颗树,插入和查询复杂度最好情况都是logN的,写起来很简单. 根据BST的性质可以很好的解决这些东西 1.查询值 int Search(int k,int x) { if(x<a[k].key && a[k].l) Search(a[k].l,x); else if(x>a[k].key && a[k].r) Search(a[k].r,x); else retur

46. 蛤蟆的数据结构笔记之四十六普里姆算法

46. 蛤蟆的数据结构笔记之四十六普里姆算法 本篇名言:"手莫伸 ,伸手必被捉.党与人民在监督 ,万目睽睽难逃脱.汝言惧捉手不伸 ,他道不伸能自觉 , 其实想伸不敢伸 ,人民咫尺手自缩.-- 陈毅" 连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边.所谓的最小成本,就是n个顶点,用n-1条边把一个连通图连接起来,并且使得权值的和最小.构造连通网的最小代价生成树,即最小生成树(Minimum Cost Spanning Tree). 找连通图的最

SDUT 3362 数据结构实验之图论六:村村通公路

数据结构实验之图论六:村村通公路 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 当前农村公路建设正如火如荼的展开,某乡镇政府决定实现村村通公路,工程师现有各个村落之间的原始道路统计数据表,表中列出了各村之间可以建设公路的若干条道路的成本,你的任务是根据给出的数据表,求使得每个村都有公路连通所需要的最低成本. Input 连续多组数据输入,每组数据包括村落数目N(N <= 1000)和可供

数据结构:二叉查找树(C语言实现)

数据结构:二叉查找树(C语言实现) ?写在前面 关于二叉树的基础知识,请看我的一篇博客:二叉树的链式存储 说明: 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: 1.若其左子树不空,则左子树上所有结点的值均小于它的根结点的值: 2.若其右子树不空,则右子树上所有结点的值均大于它的根结点的值; 3.其左.右子树也分别为二叉排序树 ?二叉查找树的建立(插入): 说明: 二叉树的创建是二叉树反复插入节点所构造出来的! 若二叉树为空树,则插入元素作为树根节点. 若根结点的键值等于key,则插入失

SDUT 3403 数据结构实验之排序六:希尔排序

数据结构实验之排序六:希尔排序 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 我们已经学习了各种排序方法,知道在不同的情况下要选择不同的排序算法,以期达到最好的排序效率:对于待排序数据来说,若数据基本有序且记录较少时, 直接插入排序的效率是非常好的,希尔排序就是针对一组基本有序的少量数据记录进行排序的高效算法.你的任务是对于给定的数据进行希尔排序,其中增量dk=n/(2^k)(k=1,2

16、蛤蟆的数据结构笔记之十六栈的应用之栈与递归之汉诺塔问题

16.蛤蟆的数据结构笔记之十六栈的应用之栈与递归之汉诺塔问题 本篇名言:"人生的价值,并不是用时间,而是用深度去衡量的." 继续栈与递归应用,汉诺塔问题. 欢迎转载,转载请标明出处: 1.  汉诺塔问题 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一

二叉查找树(BST),平衡二叉查找树(AVL),红黑树(RBT),B~/B+树(B-tree)的比较

http://www.iteye.com/topic/614070 此少侠总结的特棒,直接收藏了. 我们这个专题介绍的动态查找树主要有: 二叉查找树(BST),平衡二叉查找树(AVL),红黑树(RBT),B~/B+树(B-tree).这四种树都具备下面几个优势: (1) 都是动态结构.在删除,插入操作的时候,都不需要彻底重建原始的索引树.最多就是执行一定量的旋转,变色操作来有限的改变树的形态.而这些操作所付出的代价都远远小于重建一棵树.这一优势在<查找结构专题(1):静态查找结构概论 >中讲到

SDUT 3345 数据结构实验之二叉树六:哈夫曼编码

数据结构实验之二叉树六:哈夫曼编码 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 字符的编码方式有多种,除了大家熟悉的ASCII编码,哈夫曼编码(Huffman Coding)也是一种编码方式,它是可变字长编码.该方法完全依据字符出现概率来构造出平均长度最短的编码,称之为最优编码.哈夫曼编码常被用于数据文件压缩中,其压缩率通常在20%-90%之间.你的任务是对从键盘输入的一个字符串求出它的ASCII编码长度和哈夫曼

SDUT-3378_数据结构实验之查找六:顺序查找

数据结构实验之查找六:顺序查找 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 在一个给定的无序序列里,查找与给定关键字相同的元素,若存在则输出找到的元素在序列中的位序和需要进行的比较次数,不存在则输出"No",序列位序从1到n,要求查找从最后一个元素开始,序列中无重复元素. Input 连续多组数据输入,每组输入数据第一行首先输入两个整数 n (n <= 10^6) 和 k (1 <= k &