找完全二叉树最底层最右边的结点

来源:互联网 发布:手机文字游戏制作软件 编辑:程序博客网 时间:2024/04/28 00:57

之前看到的一道题目。想了一下,借助队列用层次遍历。过程

1、把根结点入队列

2、如果队列非空,重复3-4,否则执行5。

3、取出队列头结点,如果它有左子树、右子树,则子树入队列。

4、遍历此结点。

5、结束遍历。

这样做的话,算法复杂度为O(n)。看阿里的一篇面经,说有log(n)算法,在网上搜了一下,总结如下:

一颗二叉树的总结点其实是知道的,设为N。


如上图,总共有15个结点,那么找15号结点只需从根结点开始,向右--向右--向右。

假设只有14个点,那么向右--向右--向左

假设只有13个结点,那么向右---向左---向右

……

……

可以找到规律,总结点数即为最后一个结点,也就是我们要找的结点。把此结点一直除以2,记录其余数。之后根据余数来找。

例如15号结点,一直除以2,余数分别为(15%2)1、(7%2)1、(3%2)1

例如14号结点,一直除以2,余数分别为(14%2)0、(7%2)1、(3%2)1

…………

把这些余数逆序,从根结点开始找,如果是1,则向右,如果是0则向左。

这样算法时间复杂度为log(n)。

0 0
原创粉丝点击