特殊二叉树

1.堆(特殊的树) 
(1)大顶堆:根结点最大,每个节点的值大于等于其孩子节点,用于升序(小->大)排列
(2)小顶堆:根结点最小,每个节点的值小于等于其孩子节点,用于降序(大->小)排列
(3)    相关操作
  1)入队(堆):在最下面的叶子结点右边进行插入
              (如果最下一层已满,就新增一层),
            插入后若不再满足堆的特点,则需向上进行动态调整,直到满足
  2)出队(堆):将根结点出队,再将最后1个结点放到根结点位置,
              然后将新的根结点向下进行动态调整,直到满足堆特点 
  3)出队入队时间复杂度O(logn) 

2.优先队列:不再遵循先进先出的原则,但必须有序
(1)    无论入堆顺序,每次都是当前最大/小的元素(即堆顶元素)出队
(2)    最大优先队列->最大堆;最小优先队列->最小堆
(3)    出队和入队时间复杂度O(logn)
    原因:不管出队或入队,都有可能出现需要调整的情况,
        而每次调整要做的比较都是在进行二分,即小于和大于情况
(4)    操作:
    使用库函数实现,头文件<queue>
    1)大顶堆(默认):priority_queue <队列中元素类型>    队列名;
      小顶堆:(实现可将元素取负再入最大优先队列)
    priority_queue <队列元素类型,vector<类型>,greater<类型>空格>    队列名;
    如:    priority_queue <int,vector<int>,greater<int> > q;
    2)常用操作
    q.push(x);    将x入堆        O(logn)         
    q.pop();    将堆顶出队    O(logn)
    q.top();    获取堆顶元素(取而不删)O(1)     
    q.size();    队列内元素个数    O(1)
    q.empty()==1    队列为空(!q.empty()即不空)O(1) 

1.二叉搜索树(二叉排序树),除非是空树,否则一定满足以下性质
 1)左子树上节点的值均小于根节点;右子树上节点的值均大于根节点
 2)任意结点的左,右子树也是二叉搜索树
 3)没有值相同的结点
 4)二叉搜索树的中序序列一定有序 
 5)同样的有序序列可以有不同的二叉搜索树
 
2.构造二叉搜索树(在二叉搜索树中插入值为x的结点 )
    1)若根结点为空,则新建结点
    2)若x<根结点值&&无左孩子,新建左孩子 
    3)若x>根结点值&&无右孩子,新建右孩子 
    4)若x<根结点值,左子树中重复以上操作 
    5)若x>根结点值,右子树中重复以上操作 

3.查询二叉搜索树(查询第x小的数) 
    从根结点出发
    1)若左子树结点个数len>=x,则查看其左子树
    2)若左子树结点个数len+1==x,则第x小的数即为当前根结点
    3)否则,k-=左子树结点个数len+1,继续搜索其右子树 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值