题目描述:
给定一完全二叉树头结点,返回该二叉树的结点个数,要求时间复杂度为低于O(logN)。
大体思路:
由于该二叉树为完全二叉树,所以其的两个子树至少有一个是满二叉树。
有如下两种情况:
可以发现左边的二叉树的根结点的左子树为满二叉树,右根结点的右子树为满二叉树。
那么如何判断二叉树属于以上哪种情况呢?
可以用右子树高度来判断,若右子树的高度 = 整体高度 - 1则说明右子树达到最后一层了,如左图那样,因此其左子树为一满二叉树;若右子树的高度 = 整体高度 - 2则说明右子树没达到最后一层,可得右子树为满二叉树。
具体实现为当判断出左(右)子树为满二叉树时可直接依照公式 2^N - 1算出满二叉树的个数 在加上跟结点的个数,再加上对右(左)递归求解的结果。(注:可以使用递归求解的原因为完全二叉树的子树亦为完全二叉树)。
实现代码如下:
扫描二维码关注公众号,回复:
9812007 查看本文章
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).