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

本文介绍了一种通过节点数量确定完全二叉树中特定节点位置的方法,利用数学推导和递归思想,实现了从根节点到目标节点的有效路径查找。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天和朋友聊天,说是阿里有道面试题。
已知一颗完全二叉树,有N个节点 求最后一个节点,亦即最后一排最右边的那个节点。
一颗15个节点的二叉树
节点数目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为节点数,大家可以试试看,是否正确。其实这个方法也是可以从上面那种方法归纳出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值