1.二叉搜索树
定义:
1)搜索(与根元素比较大小,然后再决定左子树还是右子树,后面的找最大元素和找最小元素是一样的)、插入(像find一样找到合适的位置,进行插入)、删除、找最大元素、找最小元素的复杂度等于树高,期望,最坏
(数列有序,树退化成线性表)。
删除怎么删除呢?
分为三种情形:
a.要删除的节点是叶子节点,则直接删除。
b.有一个孩子节点,则该节点可以在其父节点调整指针绕过该节点后被删除。如下所示:
c.如果被删除的节点,有两个儿子呢?则如下图所示:这点非常重要。切记,切记!!
2)构建二叉树:最差时间复杂度为。例如,若该组数值是有序的(从小到大),则建造出来的二叉查找树的所有节点,都没有左子树。自平衡二叉查找树可以克服上述缺点,其时间复杂度为O(nlog n)
关于树或二叉树的一些结构上的定理:
a.一棵树由N个节点,N-1条边组成。
b.关于树的深度和高度的定义见下:
备注:高度是从下往上累加的,深度是从上往下累加的,从0还是从1开始累加看题目。对同一个树而言,树的高度和深度是相同的概念,但对于结点而言是不同的概念,其深度和高度是不同的,计算的话就严格按照定义来!
c.
d.
2.二叉堆
二叉堆是完全二叉树!!!
a.二叉堆的性质,对于位置i上的元素,左儿子在位置2i上,右儿子在2i+1上,父亲在i/2上。
b.插入操作,单次插入最坏为O(logN),平均来看为O(1)。
记住,插入操作,使用上滤策略!!!
c.DeleteMin操作
记住,用下滤操作。!!!
平均和最坏时间复杂度都为O(logN)
d.BuildHeap
构建堆的时间复杂度为O(N).