算法思想一:递归

解题思路:

完全二叉树的结点数量:根节点+左子树结点数量+右子树结点数
因此可以想到采用递归算法计算二叉树根结点的左右子树结点数量再加上根节点数量

代码展示:

Python版本
class Solution:
    def nodeNum(self , head ):
        # write code here
        # 特殊情况
        if not head:
            return 0
        # 递归计算左右子树节点数量 再加上根节点数量返回
        return self.nodeNum(head.left) + self.nodeNum(head.right) + 1

复杂度分析

时间复杂度O(N):递归二叉树所有结点数量时间O(N)
空间复杂度O(N):递归栈占用空间

算法思想二:层次遍历+队列

解题思路:

可以采用二叉树的层次遍历(bfs)遍历二叉树的每一个结点,并记录遍历结点的数量即为二叉树结点数
算法流程:
1、特殊情况:根节点为空,直接返回0
2、初始化 count 记录结点数量,队列 list,并让根节点入队列
3、循环,跳出条件:队列为空:
    1、取出队列头部元素 node
    2、count += 1,记录结点数量
    3、node结点的左右子树入队列
4、返回 count
图解

代码展示:

JAVA版本
import java.util.*;
public class Solution {
    public int nodeNum(TreeNode head) {
        // 特殊情况
        if (head == null)
            return 0;
        // 初始化节点数量
        int count = 0;
        // 定义队列链表  加入根节点
        Queue<TreeNode> list = new LinkedList<>();
        list.add(head);
        while (!list.isEmpty()) {
            //poll方法相当于移除队列头部的元素
            TreeNode node = list.poll();
            count++;//统计节点的个数
            // 分别加入左右子树
            if (node.left != null)
                list.add(node.left);
            if (node.right != null)
                list.add(node.right);
        }
        return count;
    }
}

复杂度分析

时间复杂度O(N):N表示二叉树结点数量,bfs遍历所有结点时间
空间复杂度O(N):队列链表占用空间