求完全二叉树的节点个数,我采用的思想是像前面的层序遍历一样,按照层序遍历每一行的节点个数存入到结果集,最后使用长度计算结果集的节点个数。
按照层序遍历的思想:
(1)首先判断节点是否为空,为空则返回0;
(2)定义一个存放整数节点的结果集,List<Integer>
res=new ArrayList(); ArrayList()是因为其只存放结果,不会有增删改的操作,因此选用。
当需要对列表进行修改的话选用LinkedList,定义一个队列,队列的定义方法为Queue<Treenode>
q=new LinkedList<>();根节点不为空的情况下将其压入到队列中;
(3)遍历循环队列不为空的情况,当前队列是根节点不为空时,计算当前队列大小,计算大小的原因是每一层的数量不一样,避免取多或取少的情况。
再定义一个临时节点读取其元素放入结果集,读取完成后,再判断刚才节点的左右孩子是否为空,不为空则依次放入队列,重复此步骤;
最后求结果集的大小即可知结果。
class Solution {
public int countNodes(TreeNode root) {
if (root == null) {
return 0;
}
Queue<TreeNode> q = new LinkedList<>();
List<Integer> res=new LinkedList<>();
q.offer(root);
while(!q.isEmpty()){
int size=q.size();
for(int i=0;i<size;++i){
TreeNode cur=q.peek();
q.poll();
res.add(cur.val);
if(cur.left!=null){
q.offer(cur.left);
}
if(cur.right!=null){
q.offer(cur.right);
}
}
}
return res.size();
}
}