数据结构(一) 二叉查找树

在物质点法(MPM)中,恰当地使用特定数据结构,可以实现更高的计算效率。其中,常涉及的数据结构有:


其中,VBD 是基于数据结构 B+tree。B+tree 是 B树 的变种。

Our “VBD”, so named because it is a Volumetric, Dynamic grid that shares several characteristics with B+trees, exploits spatial coherency of time-varying data to separately and compactly encode data values and grid topology.


二叉搜索树

树(tree)是一种常见的数据结构,这里先介绍二叉搜索树(Binary Search Tree)。二叉搜索树的特点:

1.所有非叶子结点至多拥有两个儿子(Left和Right);

2.所有结点存储一个关键字;

3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;

二叉搜索树
二叉搜索树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键字大,就进入右儿子;如果左儿子或右儿子的指针为空,则报告找不到相应的关键字;

如果二叉搜索树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么B树的搜索性能逼近二分查找;但它比连续内存空间的二分查找的优点是,改变二叉搜索树结构(插入与删除结点)不需要移动大段的内存数据,甚至通常是常数开销;

但二叉搜索树在经过多次插入与删除后,有可能导致不同的结构:

在这里插入图片描述
右边也是一个二叉搜索树,但它的搜索性能已经是线性的了;同样的关键字集合有可能导致不同的树结构索引;所以,使用二叉搜索树还要考虑尽可能让B树保持左图的结构,和避免右图的结构,也就是所谓的“平衡”问题;

实际使用的二叉搜索树都是在原二叉搜索树的基础上加上平衡算法,即“平衡二叉树”;如何保持B树结点分布均匀的平衡算法是平衡二叉树的关键;平衡算法是一种在二叉搜索树中插入和删除结点的策略;

注:以上文章摘自博文 B树、B-树、B+树、B*树 作者:MagnumLu 1

参照《数据结构与算法分析(C语言描述)》写的程序例子

struct TreeNode;

typedef int ElementType;
typedef struct TreeNode *Position;
typedef struct TreeNode *SearchTree;

SearchTree MakeEmpty(SearchTree T);
Position Find(ElementType x, SearchTree T);
Position FindMin(SearchTree T);
Position FindMax(SearchTree T);
SearchTree Insert(ElementType x, SearchTree T);
SearchTree Delete(ElementType x, SearchTree T);
ElementType Retrieve(Position p);

struct TreeNode {
	ElementType Element;

	Position FirstChild;
	Position NextSibling;
};

SearchTree MakeEmpty(SearchTree T) {
	if (T != nullptr) {
		MakeEmpty(T->FirstChild);
		MakeEmpty(T->NextSibling);
		delete T;
	}

	return	nullptr;
}

SearchTree Insert(ElementType x, SearchTree T) {
	if (T != nullptr) {
		if (T->Element > x) T->FirstChild = Insert(x, T->FirstChild);
		else if (T->Element < x) T->NextSibling = Insert(x, T->NextSibling);
	}
	else {
		T = new TreeNode(); T->Element = x; T->FirstChild = nullptr; T->NextSibling = nullptr;
	}

	return T;
}

Position Find(ElementType x, SearchTree T) {
	if (T == nullptr) return nullptr;

	if (T->Element > x) return Find(x, T->FirstChild);
	else if (T->Element < x) return(x, T->NextSibling);
	else return T;
}

Position FindMin(SearchTree T) {
	if (T == nullptr) return nullptr;
	else if (T->FirstChild != nullptr) return FindMin(T->FirstChild);
	else return T;
}

Position FindMax(SearchTree T) {
	if (T == nullptr) return nullptr;
	else if (T->NextSibling != nullptr) return FindMax(T->NextSibling);
	else return T;
}

SearchTree Delete(ElementType x, SearchTree T) {
	if (T == nullptr) {
		// error
	}
	else if (T->Element > x) {
		T->FirstChild = Delete(x, T->FirstChild);
	}
	else if (T->Element < x) {
		T->NextSibling = Delete(x, T->NextSibling);
	}
	else if (T->FirstChild != nullptr && T->NextSibling != nullptr) {
		Position TempCell = FindMin(T->NextSibling);
		T->Element = TempCell->Element;
		T->NextSibling = Delete(T->Element, T->NextSibling);
	}
	else {
		Position tempCell = T;
		if (T->FirstChild == nullptr) T = T->NextSibling;
		else if (T->NextSibling == nullptr) T = T->FirstChild;

		delete tempCell;
	}
}

ElementType Retrieve(Position p) {

}

  1. 博文链接:https://blog.csdn.net/qq_28584889/article/details/88777393 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值