[算法]二叉树基础与二叉查找树与堆
在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。
二叉树性质:
1、二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。
2、二叉树第i层上的结点数目最多为2^(i-1)个(i≥1)
3、深度为k的二叉树至多有2^k-1个结点
4、在任意-棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则no=n2+1。
概念:
满二叉树:一棵深度为k,且有(2的k次方)-1个节点成为满二叉树
完全二叉树:深度为k,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中序号为1至n的节点对应时,称之为完全二叉树
存储结构:
(1)顺序存储:数组,向量等。 优点:可快速读取父节点和子节点; 缺点:如果不是完全二叉树,则会浪费空间。
当一个元素的下标为i,则它的父节点为(i-1)/2;它的左右儿子分别为2*i+1和2*i+2
(2)链表存储:单、双向链表。 优点:节省空间; 缺点:不能随机存取父节点(单向链表的话),需要重新遍历。
堆的性质:
1、堆是一个二叉树。堆上每个节点的值都大于等于它的两个儿子的值。
2、堆顶的值一定是整个堆的最大值。
3、因此适合用堆来构造优先队列(priority queue),优先队列支持两个基本操作,删除最大值和插入新值。
堆的操作:
1、插入数据。从最底插入,不断与父节点比较。如果父节点小于新增元素,则调换。直到找到比新元素更大的父节点。
2、删除最大数据。删除堆顶后,把最后的数据放到堆顶位置,然后从上往下调整位置。