【LeetCode】222. Count Complete Tree Nodes-完全二叉树的结点个数

一、描述:

二、思路:

完全二叉树

对于整棵二叉树,从根结点出发,一直沿左下方向遍历树的深度是l,一直沿右下方向遍历的深度是r;则有两种情况:

  1、l == r,左右深度相等,一定是完全二叉树,即满二叉树,结点个数为(2^l-1)或(2^r-1);

  2、l != r,只有一种情况:在二叉树的倒数第二层,某个父结点只有左叶子结点而无右叶子结点,及l=r+1。等价的说,将这一个多余的左叶子结点去掉的话,则每棵最小的二叉树(一共3个结点)都是满二叉树,即又回到了上述情况1,最后再加1即为总叶子结点;

因为二叉树本身就是递归定义的,故可采用递归实现。

三、代码:

/** 
 * Definition for a binary tree node. 
 * public class TreeNode { 
 *     int val; 
 *     TreeNode left; 
 *     TreeNode right; 
 *     TreeNode(int x) { val = x; } 
 * } 
 */  
public class Solution {  
    public int countNodes(TreeNode root) {  
        if(root==null){
            return 0;
        }   
          
        int l = getLeft(root);  
        int r = getRight(root);  
          
        if(l==r) {  
            return (2<<(l-1)) - 1;  //2<<2相当于2*2^2=8
        } else {  
            return countNodes(root.left) + countNodes(root.right) + 1;  
        }  
    }  
      
    private int getLeft(TreeNode root) {  
        int count = 0;  
        while(root!=null) {  
            count+=1;
            root = root.left; 
        }  
        return count;  
    }  
      
    private int getRight(TreeNode root) {  
        int count = 0;  
        while(root!=null) {
            count+=1;
            root = root.right;  
        }  
        return count;  
    }  
}  

 一点疑问:提交代码时只是改了下变量名,比如r/l/count等,改完之后再提交就会显示“Time Limit Exceeded”,我没搞懂到底是哪有问题?

转载于:https://www.cnblogs.com/WalkerSteve/p/6626838.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值