java构建大根堆_构建大根堆

对于一个没有重复元素的整数数组,请用其中元素构造一棵MaxTree,MaxTree定义为一棵二叉树,其中的节点与数组元素一一对应,同时对于MaxTree的每棵子树,它的根的元素值为子树的最大值。现有一建树方法,对于数组中的每个元素,其在树中的父亲为数组中它左边比它大的第一个数和右边比它大的第一个数中更小的一个。若两边都不存在比它大的数,那么它就是树根。请设计O(n)的算法实现这个方法。

方法不容易想到,直接说结论:

对于每个元素,找到其左边第一个大于它的数,和右边第一个大于它的数:

07d9c81ec008

对于某个元素来说,如果左右数存在,则较小者即为它的父节点;若左右其一不存在,存在者即为父节点;否则没有父节点。

07d9c81ec008

验证正确性:

除了最大数以外,每个数都可找到一个父亲。所以一定会构成树。

任何数在单独一侧的孩子至多有一个。假设K1K2都是A的孩子,则A>K1且A>K2.假设K1

07d9c81ec008

关键步骤在于:

求序列中某个元素左边和右边第一个大于它的数。

类似于之前的算法,需要借助栈:

遍历到元素x时,

情况1:s为空或x

情况2:弹出s的顶部元素直至满足情况1为止。

从左向右遍历和再从右向左遍历,分别算出某元素左边和右边第一个大于它的数。

然后综合这两张表,得到每个元素的父节点编号。

如果需要组建二叉树,建议生成一个哈希表,表的内容为数组中某个元素,对应二叉树结点的地址。数组每个元素先new产生结点,结点地址装入哈希表。然后遍历父节点编号列表,在父与子之间做指针域的链接。

这样的话,在生成父节点编号表的时候,就可以留意看看哪个元素是根节点,预先保存下来。当然这里就不做实现了。

CODE

void firstBigL(const vector&A,vector& firstBiger){

int n=A.size();

firstBiger.resize(n);

stacks;//注意里面存的是下标

for(int i=0;i

while(!s.empty()&& A[s.top()]

s.pop();

}

if(s.empty())

firstBiger[i]=-1;

else

firstBiger[i]=s.top();

s.push(i);

}

}

void firstBigR(const vector&A,vector& firstBiger){

int n=A.size();

firstBiger.resize(n);

stacks;//注意里面存的是下标

for(int i=n-1;i>=0;--i){

while(!s.empty()&& A[s.top()]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值