222. 完全二叉树的节点个数

在这里插入图片描述

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int countNodes1(TreeNode root) {
        return getNodesCount(root);
    }
    //方法一、递归遍历 
    private int getNodesCount(TreeNode root){
        if(root==null) return 0;
        //左右中,后序遍历
        int leftNodesCount = getNodesCount(root.left);
        int rightNodesCount = getNodesCount(root.right);
        int count = leftNodesCount+rightNodesCount+1;
        return count;
    } 
    //方法二、层序遍历,利用满二叉数性质来
    public int countNodes2(TreeNode root) {
        if(root==null) return 0;
        int leftDepth = getDepth(root.left);
        int rightDepth = getDepth(root.right);
        if(leftDepth==rightDepth){ //左子树是满二叉树
            //2^leftDepth其实是 (2^leftDepth - 1) + 1 ,左子树 + 根结点
            return (1<< leftDepth) +countNodes(root.right);
        }
        else{ //右子树是满二叉树
            return (1<< rightDepth) +countNodes(root.left);
        }
    }
    private int getDepth(TreeNode root){
       int depth = 0;
       while(root !=null){
           root = root.left;
           depth++;
       }
       return depth;
    }
    //方法三、层序遍历
    public int countNodes(TreeNode root) {
        if(root == null){
            return 0;
        }
         /**
         * Deque双端队列
         * 既可以添加到队尾,也可以添加到队首;
         * 既可以从队首获取,又可以从队尾获取。
         */
        Deque<TreeNode> deque = new LinkedList<>();
         //add()和offer()都是向队列中添加一个元素,调用 add() 方法就会抛出一个 unchecked 异常,而调用 offer() 方法会返回 false
        deque.offer(root);
        int result  = 0;
        while(!deque.isEmpty()){
            int size = deque.size();
            for(int i=0;i<size;i++){
                //remove() 和 poll() 方法都是从队列中删除第一个元素,如果队列元素为空,调用remove() 的行为与 Collection 接口的版本相似会抛出异常,但是新的 poll() 方法在用空集合调用时只是返回 null。
                TreeNode poll = deque.poll();
                 result  ++ ; //记录节点数
                if(poll.left!=null){
                    deque.offer(poll.left);
                }
                if(poll.right!=null){
                    deque.offer(poll.right);
                }
            }
        }
        return result;
    }
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值