文章目录
222.完全二叉树的节点个数
给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
输入:root = [1,2,3,4,5,6]
输出:6
示例 2:
输入:root = []
输出:0
完全二叉树、完美二叉树和满二叉树
- 完美二叉树(Perfect Binary Tree):每一层都是完全填满的,即每一层的所有节点都存在,没有空缺。也就是说,如果树的高度为h,则有2^h - 1个节点。
- 满二叉树(Full Binary Tree):每个节点或者有2个子节点(左子节点和右子节点),或者没有子节点(叶子节点)。也就是说,没有只有一个子节点的节点。
- 完全二叉树(Complete Binary Tree):除了最底层外,其他各层的节点数都要达到最大,且最底层必须从左到右填入。也就是说,如果在某一层有空缺,那么该空缺必须在该层的最右侧。
(注意满二叉树和完美二叉树并不是一个概念)
普通二叉树的写法
思路
求节点的数量和求高度类似,递归写法依旧是用后序遍历,统计左右子树的节点数量并返回上一层,进行累加。
完整版
- 每个节点都遍历了一遍,时间复杂度是O(N)
class Solution {
public:
int countNodes(TreeNode* root) {
//终止条件
if(root==NULL){
return 0;
}
//后序遍历
int leftNum = countNodes(root->left);
int rightNum = countNodes(root->right);
int Num = 1+leftNum+rightNum;
return Num;
}
};
完全二叉树的写法
思路
完全二叉树是除了底层节点之外全满,并且底层节点从左到右没有断开的二叉树。
当我们计算满二叉树的时候,节点数量可以直接用公式,假设满二叉树层数为n,那么节点数量就是2^n-1
。例如下图中中间的完全二叉树,前三层的节点数量就是2^3-1=7
。
因此可以通过完全二叉树除了底层都是满的这一特性来计算节点数。
遍历一个二叉树的子树,其子树如果是满二叉树,可以先得到子树的深度,然后直接2^n-1。
下面问题就是如何判断子树是否是满二叉树,并计算其深度。如果是满二叉树,向左遍历的深度和向右遍历的深度一定是相等的,并且,本题目规定了是一个完全二叉树,因此不存在左右深度相同但是中间存在NULL的情况。如下图所示。
但是图中的完全二叉