树与堆

树的结构如下图,其实际是类似链表的结构,只不过后续连接的不止一个数据
图一

template <typename T>
//树结构的定义(未包含实现功能)
class Tree
{
	int size;		//子节点数量
public:
	T data;			//数据
	Tree **childs;	//子节点		用数组指针来存放
}

这种形式画出来的连接图类似树状图而称为树结构,其中一些关于特殊的树概念:

二叉树:就是一棵树的孩子,只有两个分为左孩子和右孩子。

template <typename type>
class TreeNode		//二叉树节点
{
	type data;
	TreeNode *left;  //二叉树的左子树
	TreeNode *right; //二叉树的右子树
}

满二叉树:深度为k且有2^k-1个结点的二叉树,即除了叶外其他节点的都有两个孩子,如下图
在这里插入图片描述
完全二叉树:当二叉树的深度为h时,它的h层节点必须都是连续靠左并不可隔开的(满二叉树也符合),并且1~h-1层的结点数都达到最大个数(即1~h-1层为一个满二叉树),如下图:
在这里插入图片描述

上面的类是直接以树结构的原理直接实现的,其实还有一种以数组的形式来实现,通常用于来实现完全二叉树。以数组下标表示节点的位置,根节点为1,数组0的位置不管,左孩子的下标为父节点的两倍,右孩子的下标为父节点的两倍加一。

template<typename T>
class ArrayTree
{
	vector<T> tree;
public:
	
	ArrayTree()
	{
		tree.resize(1); //根节点为1
	}
	void addTree(T v)
	{
		tree.push_back(v);
	}

	T get_left(int index,T val)
	{
		if (index*2<tree.size())
		{
			return tree[index * 2];
		} 
		else
		{
			cout << "下标越界" << endl;
			throw std::out_of_range("下标越界");
		}
	}

	T get_right(int index, T val)
	{
		if (index * 2+1<tree.size())
		{
			return tree[index * 2+1];
		}
		else
		{
			cout << "下标越界" << endl;
			throw std::out_of_range("下标越界");
		}
	}

	T get_parent(int index, T val)
	{
		if (index<tree.size()&&index!=1)
		{
			return tree[index/2];
		}
		else
		{
			cout << "下标越界" << endl;
			throw std::out_of_range("下标越界");
		}
	}

};

堆分为最小堆和最大堆,以最大堆为例,其为满二叉树且父节点都比子节点大。

通常取出一堆数据的最大(最小)的几个,用堆来实现效率最高(比如游戏实现战力排行榜,可以用堆来存储战力,就不用遍历所有数据),这就是堆排序,每次取出堆顶(最值),把满二叉树最后的叶(数组的最后一个放到顶),再根据规则移动再次形成最大堆(最小堆)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉排序(Binary Search Tree,BST)和(Heap)是两种常见的数据结构,它们有以下区别: 1. 结构特点: - 二叉排序:BST是一种二叉,其中每个节点的值大于其左子中的所有节点的值,小于其右子中的所有节点的值。 - 是一种完全二叉,其中每个节点的值都大于或等于其子节点的值(最大),或者每个节点的值都小于或等于其子节点的值(最小)。 2. 插入和删除操作: - 二叉排序:在BST中插入和删除节点的操作相对简单,只需按照特定规则找到合适的位置进行插入或删除即可。 - 的插入和删除操作相对复杂,需要维护的性质。插入操作会将新元素放在的末尾,并通过上浮操作将其调整到合适位置;删除操作会将顶元素移除,并通过下沉操作将新的顶元素调整到合适位置。 3. 应用场景: - 二叉排序:BST常用于实现动态集合,可以高效地支持查找、插入和删除操作。它还可以用于实现有序遍历等操作。 - 常用于实现优先队列,可以高效地找到最大或最小元素。它还可以用于排序算法(如排序)和图算法(如Dijkstra算法)等。 4. 时间复杂度: - 二叉排序:在平衡的情况下,BST的查找、插入和删除操作的平均时间复杂度为O(log n),但在最坏情况下可能退化为链表,时间复杂度为O(n)。 - 的插入和删除操作的时间复杂度为O(log n),其中n为中元素的个数。的查找操作不是其主要优势,时间复杂度为O(n)。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值