完全二叉树的结点个数(二分查找)

题目描述:

给定一完全二叉树头结点,返回该二叉树的结点个数,要求时间复杂度为低于O(logN)。

大体思路:

由于该二叉树为完全二叉树,所以其的两个子树至少有一个是满二叉树。

有如下两种情况:

可以发现左边的二叉树的根结点的左子树为满二叉树,右根结点的右子树为满二叉树。

那么如何判断二叉树属于以上哪种情况呢?

可以用右子树高度来判断,若右子树的高度 = 整体高度 - 1则说明右子树达到最后一层了,如左图那样,因此其左子树为一满二叉树;若右子树的高度 = 整体高度 - 2则说明右子树没达到最后一层,可得右子树为满二叉树。

具体实现为当判断出左(右)子树为满二叉树时可直接依照公式 2^N - 1算出满二叉树的个数 在加上跟结点的个数,再加上对右(左)递归求解的结果。(注:可以使用递归求解的原因为完全二叉树的子树亦为完全二叉树)。

实现代码如下:

     public static int selution(Node root) {
         if (root == null) {
             return 0;
         }
         int rootHeight = getHeight(root);
         int rightHeight = getHeight(root.right);
         if (rootHeight == rightHeight + 1) { //左子树为满二叉树
             return (int)Math.pow(2, rootHeight - 1 ) + selution(root.right);
         } else { //rootHeight == rightHeight + 2 右子树为满二叉树
             return (int)Math.pow(2, rootHeight - 2 ) + selution(root.left);
         }
     }
     public static int getHeight(Node root) {
         int height = 0;
         for (Node node = root; node != null; height++, node = node.left) {};
         return height;
     }

时间复杂度分析:

设所有点的个数为N,数高度为H,每次递归都要计算子树的高度,其最坏情况下为H + H-1 +……+1 = H(H+1)/2,因此其时间复杂度为O(H^2)=O(log(N)^2).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值