Leetcode222.完全二叉树的节点个数 Count Complete Tree Nodes(Java)

Leetcode222.完全二叉树的节点个数 Count Complete Tree Nodes(Java)

##Binary Search##, ##Tree##

完全二叉树的节点个数

可直接采用DFS或BFS方法求出总的结点总数

DFS

采用后续遍历,先计算左右两子树的总结点数,考虑到还有未被计算的根节点,返回总结点数 + 1

时间复杂度: O(n)

class Solution {
    public int countNodes(TreeNode root) {
        if (root == null) return 0;
        return countNodes(root.left) + countNodes(root.right) + 1;
    }
}

二分搜索

完全二叉树:若设二叉树的深度为k,除第k层外,其他各层(1 ~ k - 1)的结点数都达到最大个数,且第k层的所有结点都连续集中在最左边,就是完全二叉树

img

满二叉树:一颗二叉树的结点要么是叶子结点,要么它有两个子结点(如果一个二叉树的层数为k,且结点总数时(2^k)-1,则它是满二叉树。

img

对于任意一棵完全二叉树都可以这样递归

  • 该完全二叉树是满二叉树,计算从该树根节点一直向左和一直向右的高度,当两高度相等h时说明这棵树是满二叉树,则该树的结点总数为(2^h) - 1
  • 该树不是满二叉树,即左右两高度不相等,此时必定满足这样一个性质:该树根节点的左子树和右子树必然有一棵是满二叉树
    • 左边是满二叉树
    • 右边是满二叉树
    • 对于左右两棵子树,满二叉树的结点数可以根据(2^h) - 1计算得到,对于非满二叉树的完全二叉树,其结点数可以采用同样的方式递归计算

时间复杂度: O(logn * logn)
每次判断左右两边深度为O(logn),总共需要判断O(logn)次

class Solution {
    public int countNodes(TreeNode root) {
        if (root == null) return 0;
        int x = 1, y = 1;
        TreeNode l = root, r = root;
        while (l.left != null) {
            x ++;
            l = l.left;
        }
        while (r.right != null) {
            y ++;
            r = r.right;
        }
        if (x == y) return (1 << x) - 1;
        return countNodes(root.left) + countNodes(root.right) + 1;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值