给定一棵完全二叉树的头节点head,返回这棵树的节点个数。 
   完全二叉树指:设二叉树的深度为h,则 [1,h-1] 层的节点数都满足 
个 
   数据范围:节点数量满足 
,节点上每个值都满足 
 
   进阶:空间复杂度 
 , 时间复杂度 
 
                                        class Solution {
public:
  int nodeNum(struct TreeNode* head) {
    if (!head) return 0;
    return 1 + nodeNum(head->left) + nodeNum(head->right);
  }
}; /**
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    int get_height(struct TreeNode *head){
        return head == NULL ? 0 : get_height(head->left) + 1;
    }
    int nodeNum(struct TreeNode* head) {
        if(head == NULL)
            return 0;
        int height = get_height(head);
        int cur_h = 1;
        if(head->right != NULL){
            struct TreeNode *new_head = head->right;
            cur_h++;
            while(new_head->left != NULL){
                new_head = new_head->left;
                cur_h++;
            }
        }
        if(cur_h == height)
            return pow(2, height-1) + nodeNum(head->right);
        else
            return pow(2, cur_h-1) + nodeNum(head->left);
    }
}; public class Solution {
    int nodeCount = 0;
    public int nodeNum(TreeNode head) {
        count(head);
        return nodeCount;
    }
    
    public void count(TreeNode root) {
        if(root != null){
            nodeCount ++;
            count(root.left);
            count(root.right);
        }
    }
} 但其实我们有更好的方法来进行优化,假设整棵树的深度为h(只要溜一遍树的左边界就可以得到),我们每次考虑右树最左的节点有没有到整棵树的最深层。 public class Solution {
    public int nodeNum(TreeNode head) {
        if(head == null) return 0;     // 空树返回0
        return bs(head, 1, mostLeftLevel(head, 1));
    }
    
    // 计算node为根的子树最深可以到达哪一层,level为node节点所在层号
    private int mostLeftLevel(TreeNode node, int level) {
        while(node != null){
            level ++;
            node = node.left;
        }
        return level - 1;
    }
    
    // node在第level层,h为树深
    private int bs(TreeNode node, int level, int h){
        if(level == h) return 1;
        if(mostLeftLevel(node.right, level + 1) == h){
            // 右树的最左节点到底了,左树一定是满二叉树,右树递归
            return (1 << (h - level)) + bs(node.right, level + 1, h);
        }else{
            // 右树的最左节点没到底,右树一定是满二叉树,左树递归
            return (1 << (h - level - 1)) + bs(node.left, level + 1, h);
        }
    }
}  public int nodeNum(TreeNode head) {
        if(head == null) return 0;
        int leftCnt = nodeNum(head.left) + 1;
        int rightCnt =  nodeNum(head.right) + leftCnt;
        return rightCnt;
    } public static int getHeight(TreeNode head) {
        return head == null ? 0 : getHeight(head.left) + 1;
    }
    public static int nodeNum(TreeNode head) {
        if (head == null)
            return 0;
        // 求出高度
        int height = getHeight(head);
        int curHeight = 1;
        if (head.right != null) {
            TreeNode newHead = head.right;
            curHeight++;
            while (newHead.left != null) {
                newHead = newHead.left;
                curHeight++;
            }
        }
        if (curHeight == height)
            // 说明当前的 head 左边是满的,则不满的在右边
            return (int) Math.pow(2, height - 1) + nodeNum(head.right);
         else
             // 高度不一致,则说明右边是满的,则说明不满的在左边
            return (int) Math.pow(2, curHeight - 1) + nodeNum(head.left);
    }  /**
 * struct TreeNode {
 *  int val;
 *  struct TreeNode *left;
 *  struct TreeNode *right;
 *  TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
#include <queue>
class Solution {
  public:
    /**
层序遍历,一边遍历一边计数
     */
    int nodeNum(TreeNode* head) {
        int ans = 0;
        queue<TreeNode*>lab;
        lab.push(head);
        while (!lab.empty()) {
            TreeNode* temp = lab.front();
            lab.pop();
            if (temp) {
                ans++;
                lab.push(temp->left);
                lab.push(temp->right);
            }
        }
        return ans;
    }
};
 public int nodeNum (TreeNode head) {
    // write code here
    int res=0;
    LinkedList<TreeNode> queue=new LinkedList<>();
    queue.add(head);
    while(!queue.isEmpty()){
        TreeNode node=queue.poll();
        if(node==null){
            return res;
        }else{
            res++;
            queue.add(node.left);
            queue.add(node.right);
        }
    }
    return res;
} if not head: return 0 return self.nodeNum(head.left)+1+self.nodeNum(head.right) #递归
/**
 * #[derive(PartialEq, Eq, Debug, Clone)]
 * pub struct TreeNode {
 *     pub val: i32,
 *     pub left: Option<Box<TreeNode>>,
 *     pub right: Option<Box<TreeNode>>,
 * }
 *
 * impl TreeNode {
 *     #[inline]
 *     fn new(val: i32) -> Self {
 *         TreeNode {
 *             val: val,
 *             left: None,
 *             right: None,
 *         }
 *     }
 * }
 */
struct Solution{
}
impl Solution {
    fn new() -> Self {
        Solution{}
    }
    /**
    * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    *
    * 
        * @param head TreeNode类 
        * @return int整型
    */
    pub fn nodeNum(&self, mut head: Option<Box<TreeNode>>) -> i32 {
        // write code here
        if head.is_none() {0} else {
            1 + 
            self.nodeNum(head.as_mut().unwrap().left.take()) + 
            self.nodeNum(head.as_mut().unwrap().right.take())
        }
    }
} /**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
}*/
import java.util.*;
public class Solution {
    public int nodeNum(TreeNode head) {
        if(head==null){
            return 0;
        }
        Queue<TreeNode> queue=new LinkedList<>();
        queue.add(head);
        int sum=0;
        while(!queue.isEmpty()){
            int size=queue.size();
            sum+=size;
            for(int i=0;i<size;i++){
                TreeNode node=queue.poll();
                if(node.left!=null){
                    queue.add(node.left);
                }
                if(node.right!=null){
                    queue.add(node.right);
                }
            }
        }
        return sum;
    }
} package main
import . "nc_tools"
/*
 * type TreeNode struct {
 *   Val int
 *   Left *TreeNode
 *   Right *TreeNode
 * }
 */
/**
 * 
 * @param head TreeNode类 
 * @return int整型
*/
func nodeNum( head *TreeNode ) int {
    ans:=0
    var order func(*TreeNode)
    order=func(root *TreeNode){
        if root==nil{
            return
        }
        ans++
        order(root.Left)
        order(root.Right)
    }
    order(head)
    return ans
} 因为是完全二叉树,直接数最后一层的个数就行了,最后一层的个数等于2**height - (遇到的叶子节点个数) class Solution: count = 0 def nodeNum(self , head: TreeNode) -> int: # write code here def height(head): if not head: self.count += 1 return 0 return max(height(head.left), height(head.right)) + 1 h = height(head) ret = 0 for i in range(h): ret += 2**i lastLevel = 2**h return ret - (lastLevel - self.count)
function nodeNum( head ) {
    // write code here
    let queue = [];
    let count = 0;
    if(head==null) return count;
    queue.push(head);
    while(queue.length>0){
        let len = queue.length;
        count = len+count;
        while(len--){
            let node = queue.shift();
            if(node.left) queue.push(node.left);
            if(node.right) queue.push(node.right);
        }
    }
    return count;
} /**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
}*/
import java.util.*;
public class Solution {
    public int nodeNum(TreeNode root) {
         // write code here
        if(root==null){
            return 0;
        }
        Queue<TreeNode> queue=new LinkedList<>();
        queue.offer(root);
        int res=0;
        while(!queue.isEmpty()){
            int n=queue.size();
            res+=n;
            //ArrayList<Integer> tem=new ArrayList<>();
            for(int i=0;i<n;i++){
                TreeNode cur=queue.poll();
                //tem.add(cur.val);
                if(cur.left!=null){
                    queue.offer(cur.left);
                }
                if(cur.right!=null){
                    queue.offer(cur.right);
                }
            }
            //res.add(tem);
        }
        return res;
    }
}