2018年901真题解析(持续更新中)

本文探讨了栈操作中输出序列的性质,通过反证法证明在递增输入序列下,输出序列中不存在i<j<k使得pj<pk<pi。此外,还介绍了如何利用完全二叉树的特性,结合哈希表寻找节点的最近公共祖先,提出一个logn时间复杂度的算法。
摘要由CSDN通过智能技术生成

1、若借助栈由输入序列1,2…n得到的输出序列为p1p2…pn(它是输入序列的一个排列),证明在输出序列中不可能出现这样的情形:存在着i<j<k,使pj<pk<pi。

证明(反证法):假设存在着i<j<k,使pj<pk<pi。因为i<j<k,所以pi先出栈,pj再出栈,pk最后出栈。因为输入序列是递增序列且pj<pi,所以pi在出栈前pj一定存在栈中,否则pj一定大于pi。同理,pi在出栈前pk一定存在栈中。即pi在出栈前pj与pk同时都在栈中。

又因为输入序列是递增序列且pj<pk,所以pj在出栈前pk不在栈中,也就是说pj在栈中时,pk不能在栈中。这就与刚才得到的结论矛盾(pi在出栈前pj与pk同时都在栈中),所以假设错误,不可能存在出现这样的情形:存在着i<j<k,使pj<pk<pi

考虑到是一颗完全二叉树,因此父节点编号与子节点编号有2倍关系。因此,可以考虑一个logn的算法。对于A[i]节点,它所有祖先节点集合为{A[i], A[i/2], ...., A[1]}并利用哈希表存储。再用同样的方法对A[j]节点处理,即{A[j],A[j/2],...},每次求得一个去哈希表中查找元素是否存在,如果存在那么最近公共祖先就是该值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值