二叉排序树(折半查找树)模板类实现

本文介绍了二叉排序树(折半查找树)的概念和特性,强调其在数据结构中的重要性。通过分析树的结构,展示了如何进行深度优先搜索(DFS)并得到有序序列。此外,详细阐述了BinSearchTree类的设计,包括构造器、插入、删除和析构等关键操作的实现,特别是删除操作的复杂性,以及如何找到直接后继节点。
摘要由CSDN通过智能技术生成

折半查找树也叫做二叉排序树。所谓的折半查找树就是左子树的所有节点都比跟节点小,右子树的所有节点都比根节点大(不考虑有重复元素的情况)。

上图就是一颗典型的排序二叉树。它是平衡排序二叉树(AVL)的基础。

可以很容易的看出来,上图的dfs序就是从小到大排好序的。

以下内容来自数据结构与STL。

BinSearchTree类的字段如下:

#ifndef _BIN_SEARCH_TREE_
#define _BIN_SEARCH_TREE_
template<class T>
class BinSearchTree {
	struct tree_node {
		T item;
		tree_node *parent, *left, *right;
		bool isHeader;
	};
	tree_node *header;
	unsigned node_count;
};
#endif
节点tree_node中包含了一个数据字段(item),三个指针字段,一个头结点字段(采用头结点形式实现)

BinSearchTree中包含一个指向头结点的指针header,跟一个记录节点个数的node_count字段。

构造器:

BinSearchTree(){ 
		header = new tree_node; 
		header->parent = NULL;//parent指向根节点,在一颗空树中指定根节点是不合理的
		header->left = header;
		header->right = header;
		header->isHeader = true;
		node_count = 0;
	}

在BinSearchTree中添加一个迭代器类Iterator。

#ifndef _BIN_SEARCH_TREE_
#define _BIN_SEARCH_TREE_
template<class T>
class BinSearchTree {
	struct tree_node {
		T item;
		tree_node *parent, *left, *right;
		bool isHeader;
	};
	typedef tree_node *Link;
	tree_node *header;
	unsigned node_count;
protected:
	class Iterator {
	protected:
		Link link;
	public:
		Iterator() {}
		Iterator(Link new_link) :link(new_link) {}
	};
public:
	BinSearchTree(){ 
		header = new tree_node; 
		header->parent = NULL;//parent指向根节点,在一颗空树中指定根节点是不合理的
		header->left = header;
		header->right = header;
		header->isHeader = true;
		node_count = 0;
	}
};
#endif
向BinSearchTree类中添加size方法:

unsigned size() {
		return node_count;
	}
下面分别添加find,insert,erase方法。

Iterator find(const T& item) {
		Link parent = header;
		Link child = header->parent;
		while (child != NULL) {
		
二叉排序树折半查找二叉是两种不同的数据结构,它们在构建方式和查找性能上有所不同。 1. 二叉排序树(Binary Search Tree,BST)是一种特殊的二叉,它满足以下条件: - 左子上的所有节点的值都小于根节点的值。 - 右子上的所有节点的值都大于根节点的值。 - 左右子也分别是二叉排序树二叉排序树的构建过程是逐个插入节点,根据节点的值与当前节点的大小关系,将节点插入到左子或右子中。二叉排序树的查找操作是通过比较节点的值与目标值的大小关系,递归地在左子或右子中查找,直到找到目标值或遍历到叶子节点。 2. 折半查找二叉(Binary Search Tree,BST)也是一种特殊的二叉,它满足以下条件: - 左子上的所有节点的值都小于根节点的值。 - 右子上的所有节点的值都大于根节点的值。 折半查找二叉的构建过程是根据有序序列的中间元素构建根节点,然后递归地将左半部分的有序序列构建为左子,右半部分的有序序列构建为右子折半查找二叉的查找操作是通过比较目标值与当前节点的大小关系,递归地在左子或右子中查找,直到找到目标值或遍历到叶子节点。 区别: - 构建方式:二叉排序树是逐个插入节点构建的,而折半查找二叉是根据有序序列的中间元素构建的。 - 查找性能:在有序序列中查找一个元素时,折半查找二叉的平均查找长度为O(log2n),其中n为节点个数;而二叉排序树的查找性能取决于的形状,最好的情况下为O(log2n),最差的情况下为O(n)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值