目录
每日一句
千言万语给人留下的印象,不然其一次行动来的深刻
作者简介
🏡个人主页:XiaoChen_Android
📚学习专栏:力扣专栏
🕒发布日期:2022/8/26
『LeetCode|每日一题』完全二叉树的节点个数
1.每日一题
2.解题思路
2.1 思路分析
此题有一个很容易理解的方法,就是一直递归调用,把左节点和右节点全都遍历完,但是这样在满二叉树的情况下,时间消耗会很高。容易发现满二叉树有以下几个特点,左子树和右子树高度一样,并且节点数等于2 ^ n - 1,n为高度;如图所示:
S1:首先判断该树是不是为空,如果为空则返回0;
S2:利用满二叉树来优化算法,定义两个变量分别是左子树高度和右子树高度,用while循环遍历算出高度,这里补充一点,while循环条件是当前节点current不为空还是current.left不为空,可以举个例子,如图所示:
所以while循环中的循环条件为current != null;
S3:如果左子树高度和右子树高度相等,那么说明是满二叉树,利用位运算计算节点数---> (1 << leftLength) - 1;
S4:如果不相等,那么就递归调用该函数,遍历所有的左节点和右节点,最后的结果需要加1,即根节点
2.2 核心代码 (判断是否为满二叉树)
//判断是否为满二叉树
int leftLength = 0;
int rightLength = 0;
TreeNode current = root;
while(current != null){
leftLength++;
current = current.left;
}
current = root;
while(current != null){
rightLength++;
current = current.right;
}
//是满二叉树
if(leftLength == rightLength){
return (1 << leftLength) - 1;
}
2.3 完整代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int countNodes(TreeNode root) {
if(root == null){
return 0;
}
//判断是否为满二叉树
int leftLength = 0;
int rightLength = 0;
TreeNode current = root;
while(current != null){
leftLength++;
current = current.left;
}
current = root;
while(current != null){
rightLength++;
current = current.right;
}
//是满二叉树
if(leftLength == rightLength){
return (1 << leftLength) - 1;
}
//不是满二叉树
int leftNum = countNodes(root.left);
int rightNum = countNodes(root.right);
return leftNum + rightNum + 1;
}
}
2.4 运行情况
🍁 类似题目推荐:
如果文章对各位大佬有帮助就支持一下噢,新手尝试,不好的地方请各位大佬多多指教!