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

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

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值