力扣222.完全二叉树(对递归的理解跟深刻了)

 题目链接


问题描述

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。

完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大
值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 
个节点。  注意满二叉树的公式为 2^h(层数从0开始呦~)-1

 


原因分析:

把它当成普通的二叉树来遍历其实很简单,可以用递归或者迭代。但是,当我用完全二叉树的性质的来刷题时,遇到了几个难题:return的个数过多导致我不清楚是直接返回了结果还是返回给上一层,还有就是判断条件太长导致递归步骤不清楚

if(root==NULL) return 0;//这是最末一层的时候跳出循环的一个出口

if(rightDepth==leftDepth) return (2<<leftDepth ) - 1 ;
//这是找到了满“子树”的时候,利用公式直接求个数 返回给上一层根节点

return leftnum+rightnum+1;//这是直接求得所有子树的节点数之后返回给了最上一层的节点
 

理解好遍历过程:

就是在往下递归的时候,但凡子树为满二叉树就return,直到返回给最上节点。

还有就是只有一个节点,左右节点为空也是满二叉树的。另外就是判断子树是否为满二叉树的条件。

TreeNode* left = root->left;//左子树

TreeNode* right = root->right;//右子树

int leftDepth = 0, rightDepth = 0;

 // 这里初始为0是有目的的,因为2<<0 => 2^1  遍历层数是从左子树开始算第一层<=>计算的第0层

while (left) {  // 求左子树深度
    left = left->left;
    leftDepth++;
}
while (right) { // 求右子树深度
    right = right->right;
    rightDepth++;
}
if (leftDepth == rightDepth) {
    return (2 << leftDepth) - 1; // 注意(2<<1) 相当于2^2,返回满足满二叉树的子树节点数量
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值