算法与数据结构【Java实现】:二叉查找树

告别jom Error 2:深入理解QtCreator、CMake与MSVC工具链的协作机制 本文深入解析QtCreator构建过程中常见的jom Error 2问题,揭示CMake与MSVC工具链的协作机制。从CMake生成器的工作原理到MSVC工具链的组件协作,帮助开发者系统化诊断构建错误,提升开发效率。 阅读详情

        链表能够很方便的存储数据,但是,数据的组织只能是线性的,不能有层次的组织数据,且查找元素需要线性查找,复杂度O(n)。

        二叉查找树是一种按照排序组织数据的有层次的方式

它的特点是:

(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;

即:对于任何一个子树,左子树所有结点值小于根结点,右子树所有结点值小于根结点。

查找、插入删除的最优复杂度为log(n)

在极端情况下,如果按照排序好的顺序给二叉查找树数据,那么树会退化成一个链表,复杂的同链表一样。

那么:

在随机情况下,二叉查找树的查找效率有多高呢?

测试代码:

BST tree = new BST();
		
		Random rand = new Random();
		double totalTime = 0;
		for (int i=0;i<=3000000; i++)
			tree.Insert(rand.nextInt(10000000));
		//tree.tranformIntoPerfectTree();
		for (int i=0;i<100;i++) {
			long time = System.currentTimeMillis();
			tree.Contains(new BSTNode(rand.nextInt(10000000)));
			totalTime += System.currentTimeMillis()-time;	
		}
		System.out.println("在1000万数据中查找1000次 平均耗时: "+totalTime/100);

测试结果:

随机生成300万个数据(太多内存受不了),加入二叉查找树,测试100次,平均时长为:67.63ms

为了提高查找效率,我们希望二叉树尽可能像一个完全二叉树

即整个树只有最下面两层不满,其他层均满。

为此,人们提出了两种算法

(1)DSW

当存入一定数据之后,按照一定规则将二叉查找树拉伸成链表,然后重新组织数据,使数据接近完全二叉树。以下代码使用这种方法重建二叉搜索树。因为这种方法是所有数据一起重建一棵树,所以又叫“全局重建”

(2)AVL

存入一个数据之后,该数据并非影响整棵树的平衡,因为数据总是插在最下方。所以可以只进行局部调整。

这种方法又叫“局部重建”(这个方法将在下一篇博文实现)

来看看:

平衡之后的二叉查找树的效率

测试代码及测试条件同上,加入了平衡函数tranformIntoPerfectTree()

改变不大,这是因为我们随机生成数据,如果数据有一定规律,那么效率会提高很多。

 

对于二叉查找树,有如下:

属性:

root:树的根,作为树的入口

size:数的大小,不必要,可以使用时遍历求得

方法:

Insert:插入

remove:删除,并返回被删除的数据

isEmpty:判断树是否为空

Contains:是否包含某数据

rotateRight/rotateLeft:将树进行旋转,这是DSW方法中使用的子方法

transformIntoBackbone:DSW方法的第一步,把树转化成链表

tranformIntoPerfectTree:使用DSW方法全局重构二叉树

dfs:深度优先搜索,返回搜索路径,二叉搜索树的中序遍历是数据的排序,使用递归,消耗资源

bfs:广度优先遍历,使用内存较大

 

下面是二叉查找树的代码:

package BST;

import java.util.ArrayList;
import java.util.Random;

public class BST {
	int size;
	BSTNode root;
	
	public BST() {
		root = null;
		size = 0;
	}
	public boolean isEmpty() {
		return root == null;
	}
	public void Insert(int value) {
		Insert(new BSTNode(value));
	}
	
	public boolean Contains(BSTNode node) {
		return Contains(node, root);
	}
	
	public boolean Remove(BSTNode node) {
		BSTNode[] fatherNode = new BSTNode[1];
		BSTNode toDelete = Search(node, fatherNode);		
		if (toDelete == null)
			return false;
		if (toDelete.left == null && toDelete.right == null)
			return false;
		
		if (toDelete.left == null && toDelete.right != null) {
			fatherNode[0].right = toDelete.right;
		}
		else if (toDelete.left != null && toDelete.right == null) {
			fatherNode[0].left = toDelete.left;
		}
		else if (toDelete.left != null && toDelete.right != null) {
			if(toDelete.right.right != null) {
				toDelete.right.right.left = toDelete.right.left;
				toDelete.right.left = toDelete.left;
			}
			else {
				if(toDelete.right.left != null)
					Insert(toDelete.right.left);
				toDelete.right.left = toDelete.left;
			}
			if(root != fatherNode[0])
				if (BSTNode.equals(fatherNode[0].right, toDelete))
					fatherNode[0].right = toDelete.right;
				else 
					fatherNode[0].left = toDelete.right;
			else {
				root = toDelete.right;
			}
		}
		size--;
		return true;
	}
	
	public void tranformIntoPerfectTree() {
		if (isEmpty() || size == 1) return ;
		transformIntoBackbone();	//转化为骨架结构(向右)
		//System.out.println("________________________________________");
		//printSelf();
		
		int n = this.size;
		int m = (int) Math.pow(2, Math.floor(Math.log10(n+1)/Math.log10(2))) - 1;
		int cnt = n-m;
		if(cnt>0) {
			rotateLeft(null, root);
			cnt--;
		}
		//System.out.println("m:"+m+" cnt: "+cnt);
		//printSelf();
		
		//System.exit(0);
		BSTNode grand = root;
		BSTNode now = root.right;
		if(cnt>0)
			while(true) {
				//System.out.println("___________In While_____________________________");
				//printSelf();
				rotateLeft(grand, now);
				//System.out.println("___________In While_____________________________");
				//printSelf();
				cnt--;
				if(cnt==0) break;
				grand = grand.right;
				now = grand.right;
			}
		
		while(m>1) {
			m=m/2;
			int tmp = m;
		
			if (tmp>=1) {
				rotateLeft(null, root);
				tmp--;
			}
			
			grand = root;
			now = root.right;
			//System.out.println("Pre Rotating: " + root.value + " " + root.right.value);
			while(tmp>0) {
				rotateLeft(grand, now);
				tmp--;
				if(tmp==0) break;
				grand = grand.right;
				now = grand.right;
			}
		}
		
	}
	
	public void transformIntoBackbone() {
		BSTNode grand = null;
		BSTNode now = root;
		while(now != null) {
			//System.out.println((grand==null?"null":grand.value) + " " + now.value);
			if (now.left != null) {
				rotateRight(grand, now);
				if(grand!=null)
					now = grand.right;
				else
					now = root;
				//System.out.println("exce 1");
				//System.out.println("___________In While_____________________________");
				//printSelf();
			}
			else {
				grand = now;
				now = now.right;
				//System.out.println("exce 2");
			}
		}
	}
	
	public void transformIntoBackboneLeft() {
		BSTNode grand = null;
		BSTNode now = root;
		while(now != null) {
			if (now.right != null) {
				rotateLeft(grand, now);
				if(grand!=null)
					now = grand.left;
				else
					now = root;
			}
			else {
				grand = now;
				now = now.left;
			}
			
		}
	}
	
	
	
	
	
	private void rotateRight(BSTNode grand, BSTNode node) {
		if (node.left == null) return ;
		BSTNode nodeLeft = node.left,
				nodeRight = node.right,
				child = node.left,
				childLeft = node.left.left,
				chileRight = node.left.right;
		node.left = chileRight;
		child.right = node;
		if(grand == null) {
			root = child;
		}
		else {
			grand.right = child;
		}
	}

	
	private void rotateLeft(BSTNode grand, BSTNode node) {
		if (node == null || node.right == null) return ;
		BSTNode nodeLeft = node.left,
				nodeRight = node.right,
				child = node.right,
				childLeft = node.right.left,
				chileRight = node.right.right;
		node.right = childLeft;
		child.left = node;
		if(grand == null) {
			root = child;
		}
		else {
			grand.right = child;
		}
	}
	
	private BSTNode Search(BSTNode node, BSTNode[] fatherNode) {
		if(isEmpty()) 
			return null;
		fatherNode[0] = root;
		BSTNode search = root;
		while(true) {
			if(search == null) return null;
			if (BSTNode.equals(search, node)) {return search;}
			fatherNode[0] = search;			
			if (node.value < search.value)
				search = search.left;
			else
				search = search.right;
		}
	}
	
	private void Insert(BSTNode node) {
		//System.out.print("Value: " + node.value + " ");
		if (isEmpty()) {
			root = node;
			size = 1;
			return ;
		}
		BSTNode search = root;
		while(true) {
			//System.out.print("node value: "+ search.value + " ");
			if (node.value < search.value)
				if (search.left == null) {
					search.left = node;
					//System.out.println("add to left ");
					break;
				}
				else {
					search = search.left;
					//System.out.println("add to left ");
				}
			else 
				if (search.right == null) {
					search.right = node;
					//System.out.println("add to right ");
					break;
				}
				else {
					search = search.right;
					//System.out.println("add to right ");
				}
		}
		size++;
	}
	
	private boolean Contains(BSTNode targetNode, BSTNode nowNode) {
		if (isEmpty())
			return false;
		if (nowNode == null)
			return false;
		if (BSTNode.equals(targetNode, nowNode))
			return true;
		return Contains(targetNode, nowNode.left) || Contains(targetNode, nowNode.right);
	}
	
	public void dfs(int[] result, int[] cnt, BSTNode node) {
		if (isEmpty())
			return ;
		//System.out.println("To Node:" + node.value);
		if (node.left != null) {
			//System.out.print("L"+node.value+" ");
			dfs(result, cnt, node.left);
		}
		result[cnt[0]++] = node.value;
		
		if (node.right != null) {
			//System.out.print("R"+node.value+" ");
			dfs(result, cnt, node.right);
		}
		return ;
	}
	public void bfs(int[] result, int[] cnt) {
		if (isEmpty())
			return ;
		ArrayList<BSTNode> list = new ArrayList();
		list.add(root);
		while(!list.isEmpty()) {
			BSTNode now = list.remove(0);
			if (now.left != null)
				list.add(now.left);	
			if (now.right != null)
				list.add(now.right);
			result[cnt[0]++] = now.value;
		}
	}
	
	public void printSelf() {
		int[] result = new int[this.size];
		int[] cnt = new int[1];
		this.dfs(result, cnt, this.root);
		System.out.println("\nDFS: ");
		for(int i=0; i<result.length; i++)
			System.out.print(result[i] + " ");
		System.out.println(" Size: "+ this.size);
		
		cnt[0] = 0;
		result = new int[this.size];
		this.bfs(result, cnt);
		System.out.println("BFS: ");
		for(int i=0; i<result.length; i++)
			System.out.print(result[i] + " ");
		System.out.println();
	}
	
	static public void main(String[] argv) {
		BST tree = new BST();
		
		Random rand = new Random();
		double totalTime = 0;
		for (int i=0;i<=3000000; i++)
			tree.Insert(rand.nextInt(10000000));
		tree.tranformIntoPerfectTree();
		for (int i=0;i<100;i++) {
			long time = System.currentTimeMillis();
			tree.Contains(new BSTNode(rand.nextInt(10000000)));
			totalTime += System.currentTimeMillis()-time;	
		}
		System.out.println("在1000万数据中查找1000次 平均耗时: "+totalTime/100);
		//tree.Insert(10);tree.Insert(5);tree.Insert(11);tree.Insert(6);tree.Insert(3);
		
		//tree.printSelf();
		
		//tree.Remove(new BSTNode(14));
		//tree.Remove(new BSTNode(10));
		//tree.printSelf();
		//tree.rotateRight(null, tree.root);
		
		//tree.transformIntoBackbone();
		//tree.printSelf();
		//tree.transformIntoBackboneLeft();
		//tree.printSelf();
		
		//tree.tranformIntoPerfectTree();
		//tree.printSelf();
	}
}


class BSTNode{
	public int value;
	public BSTNode left;
	public BSTNode right;
	
	static boolean equals(BSTNode a, BSTNode b) {
		if(a==b && b==null) return true;
		if(a==null || b==null) return false;
		return a.value == b.value;
	}
	
	public BSTNode(int value) {
		this.value = value;
	}
	public BSTNode(int value, BSTNode left, BSTNode right) {
		this.value = value;
		this.left = left;
		this.right = right;
	}
	
}

 

C语言设计模式全面解析:从理论到28个实战示例 本文系统介绍了23种经典设计模式在C语言中的实现方法。通过结构体、函数指针等技巧,C语言可以优雅地模拟面向对象特性,实现代码复用与解耦。文章分类详解了创建型、结构型、行为型三大类模式,并提供了28个完整代码示例,包括单例、策略、观察者等核心模式的精简实现。这些模式在嵌入式系统、操作系统内核等场景中广泛应用,如状态机、事件驱动等。学习C语言设计模式的关键在于理解模式意图,掌握函数指针和结构体组合等技巧,并在实际项目中灵活运用。本文为C语言开发者提供了全面的设计模式参考指南。 阅读详情

相关推荐

Fiddler抓包实战:5分钟搞定微信公众号历史消息接口分析(附完整Python代码)

本文详细介绍了如何使用Fiddler抓包工具逆向分析微信公众号历史消息接口,并提供完整的Python代码实现。从环境准备、动态参数捕获到商业级采集系统架构设计,全面解析了突破官方接口限制的技术方案,帮助开发者高效获取公众号文章数据。

tree8的博客 325

查找树 java_二叉查找树之 Java的实现【上】

戳上面的蓝字关注我们哦!本文作者:skywang12345地址:cnblogs.com/skywang12345/p/3576452.html二叉查找树简介二叉查找树(Binary Search Tree),又被称为二叉搜索树。它是特殊的二叉树:对于二叉树,假设x为二叉树中的任意一个结点,x节点包含关键字key,节点x的key值记为key[x]。如果y是x的左子树中的一个结点,则key[y] &l...

weixin_33647940的博客 244

【深度学习基础】Temporal Fusion Transformer

从下向上看:全连接(Dense) → ELU(指数线性激活函数(比relu好点,有利于模型收敛)) → 全连接(Dense) → 门控线性单元(Gate)(Gated Linear Units (GLUs)) → Layernorm。:一方面,它可以进行静态上下文变量和动态变量的融合,另一方面,通过门控进行了特征选择操作,门控体现在GLU(门控线性单元)中,用了sigmoid控制信息的通过程度,具有良好的适应性,能够自动选择有效信息,自适应地调整网络复杂性。输入:主输入,可选的上下文向量c。

weixin_41838721的博客 1224

java二叉查找算法_【Java】 大话数据结构(11) 查找算法(2)(二叉排序树/二叉搜索树)...

本文根据《大话数据结构》一书,实现了Java版的二叉排序树/二叉搜索树。二叉排序树介绍在上篇博客中,顺序表的插入和删除效率还可以,但查找效率很低;而有序线性表中,可以使用折半、插值、斐波那契等查找方法来实现,但因为要保持有序,其插入和删除操作很耗费时间。二叉排序树(Binary Sort Tree),又称为二叉搜索树,则可以在高效率的查找下,同时保持插入和删除操作也又较高的效率。下图为典型的二叉排...

weixin_30951515的博客 166

从拆解到调试:用CS5523改造旧款车载显示屏的完整记录(MIPI转eDP方案)

本文详细记录了使用CS5523芯片将旧款车载显示屏从MIPI接口改造为eDP驱动的完整过程。通过对比LT8911等芯片,选择CS5523实现低功耗、高兼容性的显示升级,涵盖硬件改造、固件配置及调试技巧,最终成功提升显示效果200%。

web99的专栏 343

Android 跨进程通信-(一)Binder概念引入

前言 主要对Android中的跨进程通信进行总结下,这篇先梳理下里面的涉及的一些概念 一 多进程 1.进程与线程 进程:系统中正在运行的一个应用程序,某个程序一旦运行就是一个进程,是资源分配的最小单位; 线程:程序执行的最小单位,包含在进程中,一个进程可以包含多个线程。 2.Android应用中的多进程 (1)dalivk虚拟机 Android系统的底层任务管理以及驱动都是基于Linux系统。一个Android系统其实就是一个Linux系统,通过adb shell进入连接的手机,就可以看到Li

nihaomabmt的专栏 1103

java 查找树_二叉搜索树算法详解与Java实现

二叉查找树可以递归地定义如下,二叉查找树或者是空二叉树,或者是满足下列性质的二叉树:(1)若它的左子树不为空,则其左子树上任意结点的关键字的值都小于根结点关键字的值。(2)若它的右子树不为空,则其右子树上任意结点的关键字的值都大于根节点关键字的值。(3)它的左、右子树本身又是一个二叉查找树。从性能上来说如果二叉查找树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么二叉查找树的搜索性能...

weixin_35437233的博客 404

通过PXE的方式实现Ubuntu 24.04 自动安装

之前都是通过PXE来自动化安装Redhat系列的,例如:Rocky9、Rocky10、CentOS7、银河麒麟 Kylin-V10、Kylin-V11、OpenEuler 24.03等。现在安装Ubuntu系列的跟红帽的不太一样,所以在这里介绍下。

邢宇宇的博客 1490

java——二叉查找树(BST)算法

现代计算机和网络使我们能够访问海量的信息。高效检索这些信息的能力是处理他们的重要前提。二叉查找树(Binary Search Tree)是一种能将链表插入的灵活性和有序数组查找的高效性结合起来的优良算法。

往事散云烟,十寸光阴换一钱 1981

深入理解Cornerstone3D.js渲染Stack影像数据

这个是调用的core\src下的init.ts的init方法,作用是:初始化cornerstone-core,检测客户端是否支持WebGL,默认情况下是支持中等GPU层级.另外一个重要的是实例化WebWorkManager.WebWorkManager类似于Java的线程池,是用来对Web Worker进行管理的管理器。使用DICOMwebClient获取影像文件的元数据,然后将它们缓存到imageLoader的metaDataManager中,在上面我们可以输出元数据看一下是什么。

wangwei19820517的博客 1492

安装matlab_Matlab+yalmip+cplex安装教程及算例

数学建模/科研学习推荐学习软件:Matlab+yalmip+cplex安装教程及算例其实绝大多数本科生都是在用Matlab和LINGO求解优化问题,Matlab可以求解一般优化问题,但是当优化问题规模比较大或者在应对一些非线性问题时候,Matlab会出现求解时间长,求解效率低,甚至难以求解等问题。Matlab+yalmip+cplex是Matlab通过调用商业软件cplex求解,求解时间短,这里简...

weixin_28939637的博客 5005

java二叉查找算法_Java数据结构和算法(六)--二叉搜索树

什么是树?上面图例就是一个树,用圆代表节点,连接圆的直线代表边。树的顶端总有一个节点,通过它连接第二层的节点,然后第二层连向更下一层的节点,以此递推,所以树的顶端小,底部大。和现实中的树是相反的,但是代码一般从顶点开始执行操作本文会讲述一种特殊的树--二叉树,每个节点最多有两个子节点。普通的树,节点可以多于两个,称为多路树/多叉树树的术语:1、路径:顺着节点的边从一个节点走到另一个节点,所经过的节...

weixin_30118803的博客 246

RPMsg:协议简介

两台计算机可以通过TCP/IP进行通信,那么同一颗芯片上的两个核心怎么通信呢?

SunnyZhou-1024的博客 1万+

浅析数据结构与算法7--二叉查找树 及Java实现

Java实现代码: /** * * 此程序实现一个二叉查找树的功能,可以进行动态插入、删除关键字; * 查询给定关键字、最小关键字、最大关键字;转换为有序列表(用于排序) * */ import java.util.ArrayList; import java.util.List; public class BinarySearchTree { // 树的根结点

Donald—Hu的博客 549

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

数据结构与算法_二叉树_二叉查找树_JAVA实现

2020.04.17 二叉查找树(Binary Search Tree),又称:二叉搜索树,二叉排序树

loveloose的博客 254

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

数据结构&算法拾遗(3)-- 实现二叉查找树,java实现

二叉查找树作为二分查找的一种变种,主要是针对已排序集合数据的查找,查找的效率值为logN, N为树高,其相对于排序数组查找来说有着大数据量条件下插入较快的优势,相对于链表结构来说,具有查找复杂度低的优势,可以说是结合了链表与有序数组二者优点的一种数据结构。其缺点同快排一样,有着效率稳定性不好的特点,当树无限接近与一条链表时,其树高也就接近与链表长度,这样也就催生出了下一次要讲的数据结构--平衡查找...

冬的博客 168

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

[数据结构与算法]-二叉查找树(BLT)介绍及其实现(Java)

本文欢迎转载,转载前请联系作者,经允许后方可转载。转载后请注明出处,谢谢! http://blog.youkuaiyun.com/colton_null 作者:喝酒不骑马 Colton_Null from 优快云 一.什么是二叉查找树? 二叉查找树(Binary Search Tree, BST)是二叉树的一种。 简单来说,二叉查找树的特有性质是:对于树中的每个节点N,它的左子树中所有的元素值...

因特马 975

java实现二叉查找树

java实现简单的二叉查找树 [url]http://www.exceptionhelp.com/posts/566[/url]

jhyjb的博客 252

二叉树算法java代码_Java实现二叉搜索树算法的代码详解(图)

二叉查找树可以递归地定义如下,二叉查找树或者是空二叉树,或者是满足下列性质的二叉树:(1)若它的左子树不为空,则其左子树上任意结点的关键字的值都小于根结点关键字的值。(2)若它的右子树不为空,则其右子树上任意结点的关键字的值都大于根节点关键字的值。(3)它的左、右子树本身又是一个二叉查找树。从性能上来说如果二叉查找树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么二叉查找树的搜索性能...

weixin_30678347的博客 496

(数据结构与算法分析 五)------二叉查找树的实现( Java语言描述)

二叉查找树是对树的一个经典的应用,下面使用Java实现对二叉查找树的各种实现,其中私有方法使用递归实现,然后公有方法调用私有方法,下面上代码 首先是作为二叉树的节点的类 package com.bird.four; /** * @category 二叉查找树的节点 * @author Bird * */ public class BinaryNode { Comparable el

技术是我的毕生追求 1740

二叉查找树java实现_【数据结构和算法】二叉排序树、二叉搜索树、二叉查找树(Java实现)...

一、概念任何节点的键值一定大于其左子树中的每一个节点的键值,并小于其右子树中的每一个节点的键值。二、二叉排序树的创建&&小技巧。二叉树有一个重要的算法就是递归,当要处理子树时一般都会用到,而能够方便的使用递归的一定又是节点。所以通常是在树里调用节点的方法,在节点里完成一些递归操作。下面是构造二叉排序树的核心方法:public void add(Node node) { //其实构造...

weixin_36085895的博客 248

手写一个二叉查找树

对二叉查找树的增删改查进行了java实现 package basicKnowledge.tree; /** * @基本功能:二叉搜索树(二叉排序树) * @program:summary * @author:peicc * @create:2019-07-24 16:52:29 **/ public class BinarySearchTree<AnyType ext...

皮皮狗 373

【数据结构和算法】二叉排序树、二叉搜索树、二叉查找树(Java实现)

一、概念 任何节点的键值一定大于其左子树中的每一个节点的键值,并小于其右子树中的每一个节点的键值。 二、二叉排序树的创建 &&小技巧。二叉树有一个重要的算法就是递归,当要处理子树时一般都会用到,而能够方便的使用递归的一定又是节点。所以通常是在树里调用节点的方法,在节点里完成一些递归操作。 下面是构造二叉排序树的核心方法: public void add(Node...

zzf_forgot的博客 384

二叉查找树 中序遍历

/** * 二叉查找树 */ public class BinarySortTreeTest { // 创建一个节点类 包含值,左节点 右节点 public class Node { int value; Node left; Node right; public Node() { } // 有参构造 .

scoreclass的博客 762

算法与数据结构 (三) 二叉树的简单应用 二叉查找树,二叉堆排序

一 二叉查找树 二叉查找树又叫二叉排序树,是为了解决查找的效率问题。正常情况下查找一个元素,需要O(n)的代价,但是如果查找元素有顺序,有序数组:可以用二分查找降低到 lgn 代价,但是有序链表的代价还是O(n) 因为,链表不支持随机访问,定位不到中间元素,从而不可以一次就排除掉一半元素。此时二叉查找树的出现,完美解决了这个问题,左边的全比根小,右边的全比根大。所以理想状态下也是一次淘汰一半元...

weixin_30408309的博客 171
上一篇: 算法与数据结构【C++与Java实现】:链表篇
下一篇: 【Java课程设计】仿QQ多人聊天室(基于TCP协议与JavaSwing)附下载
WilliamCode
博客等级 码龄11年 118粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值