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],...},每次求得一个去哈希表中查找元素是否存在,如果存在那么最近公共祖先就是该值。