首页 > 代码库 > 【LeetCode】222. Count Complete Tree Nodes-完全二叉树的结点个数

【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”,我没搞懂到底是哪有问题?

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