问题描述
给你一棵 完全二叉树 的根节点 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,返回满足满二叉树的子树节点数量
}