[leedcode 222] Count Complete Tree Nodes

Given a complete binary tree, count the number of nodes.

Definition of a complete binary tree from Wikipedia:
In a complete binary tree every level, except possibly the last, is completely filled, and all nodes in the last level are as far left as possible. It can have between 1 and 2h nodes inclusive at the last level h.

/**
 * 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;
        return countNodes(root.left)+countNodes(root.right)+1;*/
        
        
     /*  方法二:
     if(root==null) return 0;
        LinkedList<TreeNode> queue=new LinkedList<TreeNode>();
        queue.add(root);
        int count=0;
        while(!queue.isEmpty()){
            int temp=queue.size();
            count+=temp;
            for(int i=0;i<temp;i++){
                TreeNode node=queue.remove();
                if(node.left!=null){
                    queue.add(node.left);
                    count++;
                }
                if(node.right!=null){
                    queue.add(node.right);
                    count++;
                }
                
            }
            
        }
        return count;*/
        /*可以证明一个完全二叉树左右子树至少有一个是满二叉树。
满二叉树的节点数是2^k-1,k是树的深度。
所以我们可以先判断该树是否为满二叉树,然后是的话直接返回结果,如果不是递归地求解子树。
这样不用遍历所有的节点。复杂度小于O(N),比对所有点遍历复杂度要小,最好的情况是O(lgN)。
推算大概在O(lgN)~O(N)之间。*/
        if(root==null) return 0;
        TreeNode l=root;
        TreeNode r=root;
        int leftH=0;
        int rightH=0;
        while(l!=null){
            l=l.left;
            leftH++;
        }
        while(r!=null){
            r=r.right;
            rightH++;
        }
        if(leftH==rightH){
            return (1<<leftH)-1;//注意优先级
        }else{
            return countNodes(root.left)+countNodes(root.right)+1;
        }
    }
}

 

posted @ 2015-08-07 23:08  ~每天进步一点点~  阅读(173)  评论(0编辑  收藏  举报