阿里一道面试题——完全二叉树的最后一颗节点

今天和朋友聊天,说是阿里有道面试题。
已知一颗完全二叉树,有N个节点 求最后一个节点,亦即最后一排最右边的那个节点。
阿里一道面试题——完全二叉树的最后一颗节点_第1张图片
节点数目2^0+……2^(k-1)>=N >= 2^0+2^1+2^2+2^3……2^k
那么树深为k+1,最后个节点在最后层为第(N-2^0+……2^(k-1))个
如果(N-2^0+……2^k-1)>2^k/2,那么在右子树,右子树有N-2^(k-1)个节点,;
如果(N-2^0+……2^k-1)<=2^k/2,那么在左子树

从根节点出发,首先要判断是在右子树里还是在左子树里。要明确一点已知节点数目N,那么我们是可以判断最后一个节点是在第几排,第几个。如上N=15,那么是在第4排的第8个节点。而8 > 4(这里判断是在右子树还是左子树)。
现在我们从节点C作为根节点的子树,按照上面的方法,最后找到该节点。


逆向思维:
我们将所有节点标号,从1~N,那么N节点就是我们要求的节点。那么N节点的父节点为N/2,其为(N%2==1)?右节点:左节点。
以上图举例:

15 % 2 = 1 ——————所以走右边
15/2 = 7
7 % 2 = 1——————所以走右边
7/2 = 3
3 % 2 = 1——————所以走右边
1 / 2 = 0——————结束

上述15为节点数,大家可以试试看,是否正确。其实这个方法也是可以从上面那种方法归纳出来。

你可能感兴趣的:(随笔)