• 【总结】二叉搜索树


    简单介绍

    二叉搜索树又叫二叉查找树。

    是一种数据结构,支持多种动态集合操作,包括查找,返回最小值,返回最大值,返回前驱和后继节点,插入和删除

    它既可以用作字典,也可以用做优先队列。

    如果一颗二叉树满足这样的特性:

    设 x为二叉查找树中的一个节点。

    1.如果 y是x 的左子树的一个节点,则 key[y] <= key[x].

    2.如果 y是x 的右子树的一个节点,则 key[x] <= key[y].

    那么则称它为二叉查找树

    二叉查找树是学习平衡树的基础

    基本操作

    1.查询

    如果在数组中我们想寻找一个元素k,时间复杂度为O(n)

    二叉搜索树中查询的话,如果k的值大于当前节点,就去搜索当前节点的右子树,如果k的值小于当前节点,就去搜索当前节点的左子树

    这样时间复杂度就为O(树的高度)

    Tree-Search(x, k)
    	if x == NULL or k == key[x]:
    	return x
    	if k < key[x]:
    	return Tree-Search(left[x], k)
    	else
    	return Tree-Search(right[x], k)
    
    

    2.遍历

    我们可以对一个二叉搜索树进行中序遍历

    inorder(x):
    	if x != NULL:
    	inorder(left[x])
    	print key[x]
    	inorder(right[x])
    
    

    调用这个函数我们就可以输出一个二叉搜索树种的所有元素

    3.插入

    同样搜索,直到遇到一个节点,

    如果我要插入的元素大于节点的值并且当前节点没有右儿子,就将插入的元素放到当前节点的右儿子上。

    或者我要插入的元素小于当前节点的值并且当前节点没有左儿子,就将插入的元素放到当前节点的左儿子上。

    Tree-Insert(T, z):
    	y = NULL, x = root[T]
    	while x != NULL:
    		y = x
    		if (key[z] < key[x]) x = left[x]; 
    		else x = right[x]
    	parent[z] = y
    	if y == NULL then root[T] = z
    	else if key[z] < key[y] then left[y] = z
    	else right[y] = z
    
    

    如果要删除元素,则需要分四种情况讨论,比较复杂

    4.查询最大最小元素

    最小元素:从根节点开始,沿着各节点的 left 指针查找下去

    Tree-Minimum(x):
    	while left[x] != NULL:
    		x = left[x]
    	return x
    
    

    最大元素:从根节点开始,沿着各节点的right指针查找

    Tree-Maximum(x):
    	while right[x] != NULL:
    		x = right[x]
    	return x
    
    

    随机构造的二叉查找树

    我们已经知道,二叉查找树上的各基本操作的运行时间都是O(h),h 为树的高度。

    但是随着元素的插入或删除,树的高度会发生变化。

    例如,如果各元素按严格增长的顺序插入,那么构造出的树就是一个高度为 n - 1 的链

    如果各元素按照随机的顺序插入,则构造出的二叉查找树的期望高度为 O(log n)

  • 相关阅读:
    用Vue来实现音乐播放器(10):Scroll组件的抽象和应用
    Vue的生命周期
    用Vue来实现音乐播放器(九):歌单数据接口分析
    Java中StringBuilder和StringBuffer的区别
    StringBuilder类型与String类型相互转换
    List中Add()与AddAll()的区别
    Map集合遍历的四种方式
    Object类型转换为Integer
    web开发中常用到的状态码
    mysql--从不订购的客户
  • 原文地址:https://www.cnblogs.com/huixinxinw/p/12208908.html
Copyright © 2020-2023  润新知