求二叉搜索树的第K小值

文章介绍了树作为层级结构的基础,特别讨论了二叉树的概念,包括其最多两个子节点的特性以及前序、中序、后序遍历方法。接着,文章深入到二叉搜索树和平衡二叉搜索树,如红黑树,强调了它们在增删查改操作中的高效性。此外,还提到了B树在数据库中的应用,以及如何利用二叉树特性找到第K小值。
摘要由CSDN通过智能技术生成

树的介绍

树是一种有序的层级结构,每个节点下面可以由若干个子节点,例如常见的DOM树

 树节点的数据结构

interface ITreeNode {
data: any
children: ITreeNode[] | null
}

二叉树 Binary Tree

二叉树,首先它是一棵树,其次它的每个节点,最多有两个子节点,分别为 left 和 right

 二叉树的遍历
    前序遍历 root left right
    中序遍历 left root right
    后序遍历 left right root

interface ITreeNode{
	value:number
	left:ITreeNode | null
	right:ITreeNode | null
}
const tree:ITreeNode = {
	value:5,
	left:{
		value:3,
		left:{
			value:2,
			left:null,
			right:null
		},
		right:{
			value:4,
			left:null,right:null
		}
	},
	right:{
		value:7,
		left:{
			value:6,
			left:null,
			right:null
		},
		right:{
			value:8,
			left:null,
			right:null
		}
	}	
}

//前序遍历
function preOrderTraverse(node:ITreeNode){
	if(node===null) return
	console.log(node.value)
	preOrderTraverse(node.left)
	preOrderTraverse(node.right)
}
//中序遍历
function inOrderTraverse(node:ITreeNode){
	if(node===null) return
	
	inOrderTraverse(node.left)
	console.log(node.value)
	inOrderTraverse(node.right)
}
//后序遍历
function postOrderTraverse(node:ITreeNode){
	if(node===null) return
	
	postOrderTraverse(node.left)
	
	postOrderTraverse(node.right)
	console.log(node.value)
}

二叉树节点的数据结构

interface IBinaryTreeNode {
data: any
left: IBinaryTreeNode | null
right: IBinaryTreeNode | null
}

性能

数组:查找快O(1) 增删慢O(n)
链表:查找慢O(n),增删快O(1)

二叉搜索树 BST:查询快 增删快 - “木桶效应”

二叉搜索树
    left 包括后代 value<=root value
    right 包括后代 value<=root value

平衡二叉搜索树BBST

BST如果不平衡,那就又成链表了
所有要尽量平衡:平衡二叉搜索树BBST
BBST增删改查,时间复杂度都是O(logn),即树的高度

红黑树

一种自平衡二叉树
分成红/黑两种颜色,通过颜色转换来维持树的平衡
低成本快速保持平衡
相对于普通平衡二叉树,它维持平衡效率更高一些

B树

物理上是多叉树,逻辑上是二叉树

一般用于高效I/O,关系型数据库常用B树来组织数据

根据树的特性用来求二叉搜索树的第K小值

/**
 * 可以用二分法进行快速查找
 * 中序遍历:从小到大排序
 */

const arr:number[]=[]

interface ITreeNode{
	value:number
	left:ITreeNode | null
	right:ITreeNode | null
}
const bst:ITreeNode = {
	value:5,
	left:{
		value:3,
		left:{
			value:2,
			left:null,
			right:null
		},
		right:{
			value:4,
			left:null,right:null
		}
	},
	right:{
		value:7,
		left:{
			value:6,
			left:null,
			right:null
		},
		right:{
			value:8,
			left:null,
			right:null
		}
	}	
}
//中序遍历
function inOrderTraverse(node:ITreeNode){
	if(node===null) return
	inOrderTraverse(node.left)
	arr.push(node.value)
	inOrderTraverse(node.right)
}

function getKthValue(node:ITreeNode,k:number):number | null{
	inOrderTraverse(node)
	return arr[k-1] || null
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值