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

题目描述:

给定一完全二叉树头结点,返回该二叉树的结点个数,要求时间复杂度为低于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).

发布了38 篇原创文章 · 获赞 4 · 访问量 2141

猜你喜欢

转载自blog.csdn.net/gw_9527/article/details/103102738