[编程思考4]从一道题分析二叉树解题

70个叶子节点  80个度为1的节点  节点总数是多少?

 


1 利用度数和总节点数关系
0度叶子节点数=2度节点数+1【证明见注解】
总节点数目=2度节点的数目+1度节点的数目+0度叶子节点数目
          =2度节点的数目+1度节点的数目+1
0度叶子节点70个----2度的节点有69个,而题目已知度为1的节点有80个
所有度的节点数目知道了,总节点的数为70+69+80=219


思路:就是求出2度节点就可以了。


2 补全完全二叉树算法
如果80个1度节点都添满,
整个树就只有0度节点和2度节点了,0度节点数目有70+80=150个
根据0度节点=2度节点-1,这个定理,这时整个树有150-1=149个2度节点,有150个0度节点
节点总数为150+149=299,
再减去我们之前多添加的80个1度节点,所以实际总数是219个节点。


思路:从补全的角度去思考问题,将树化成0度节点和2度节点的形式进行解决,其实和方法1实质是一样的。

 

3 逼近法
题目中说:70个叶子节点  80个度为1的节点。
根据公式3说的,我们可以知道任何




2^6=64(小于70的最大的2的整数次方),70-64=6,所以总数为2^7-1+6*2+80=219个结点。


首先分析这棵树:有70个叶子节点,大于2^6小于2^7,
因此这棵树至少有8层(满二叉树第8层的叶子节点数为2^(8-1)=128)
2^7-1+(70-2^6)*2+80  
前7层总数+




注:
如何证明下面这个式子
度为0叶子节点=度为2的节点数+1
解答:
所有节点的总度数=总节点数目-1=2度节点数   + 1度节点数 + 0度节点数 
所有节点的总度数=             2度节点数*2 + 1度节点数
两式相减得到,0度节点数=2度节点数+1
 




基本二叉树公式
公式1.1  度和节点关系
总度数=总节点数-1     【1.1】
(本质上是利用自下而上的唯一性,因为尽管从上而下是二分分叉的,往下走的路径有很多,
  但是自下而上来说,除了root节点,每个子节点向上一层走都只有一个父节点,而且都只有唯一路径)


公式1.2              
0度节点数=2度节点数-1   【1.2】
这个是1式和节点总数公式合起来推出来的


公式2   完全二叉树和2次方
满二叉树推断
完全二叉树节点总数=2的层数次方 -1    【2.1】
完全二叉树节点总数=叶子节点数*2-1    【2.2】
其实从上面我们可以推断,叶子节点数=2的层数次方-1   【2.3】




公式3  完全二叉树补全
完全二叉树有个性质,就是没有度为1的点,要么你是叶子节点,要么你是2度节点,不旁生枝蔓的。
将一个树所有的度为1的节点补齐,整个树就只剩下0度节点和2度节点了,也就是说就成了完全二叉树。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值