二叉树:LC222,完全二叉树的节点个数

二叉树:LC222,完全二叉树的节点个数_第1张图片二叉树:LC222,完全二叉树的节点个数_第2张图片

/**
 * 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 {
    // 分析:
    // 这是个完全二叉树:最底层可能没填满,其余各层都满了,最底层的节点都集中在最左边
    // 注意题目的每层编号:从第0层开始
    // 满二叉树的结点数为:2^depth - 1,depth从1开始
    // 如果整个树不是满二叉树,就递归其左右孩子,直到遇到满二叉树为止,用公式计算这个子树(满二叉树)的节点数量
    // 在完全二叉树中,如果递归向左遍历的深度等于递归向右遍历的深度,那说明就是满二叉树
    // 在完全二叉树中,如果递归向左遍历的深度不等于递归向右遍历的深度,则说明不是满二叉树

    public int countNodes(TreeNode root) {
        // 先判断根节点为null的情况
        if(root == null){
            return 0;
        }
        // 获取节点的左右孩子,第1次是根节点的左右孩子
        TreeNode left = root.left;
        TreeNode right = root.right;
        // 这里初始化深度从0开始,为了求指数方便
        int leftDep = 0,rightDep = 0;
        // 遍历获取左子树的深度
        while(left != null){
            leftDep++;
            left = left.left;
        }
        // 遍历获取右子树的深度
        while(right != null){
            rightDep++;
            right = right.right;
        }
        // 在完全二叉树中,如果递归向左遍历的深度等于递归向右遍历的深度,那说明就是满二叉树
        if(leftDep == rightDep){
            return (int)Math.pow(2,leftDep + 1) - 1;
        }
        // 不相等时,使用递归,+1是算上根节点
        return countNodes(root.left) + countNodes(root.right) + 1;
    }
}
// 时间复杂度:O(logn * logn)
// 空间复杂度:O(logn)

你可能感兴趣的:(算法,数据结构)