题目 已知一棵完全二叉树,求其节点的个数
要求 时间复杂度低于O(N),N为这棵树的节点个数
思路 沿左子树树的左节点遍历至底部,求出树的左子树高度;再沿右子树的左节点遍历至底部,求出右子树高度。如果右子树高度小于左子树高度,说明右子树部分是层数比左子树少1的满二叉树,递归计算左子树(必为完全二叉树)的节点个数,将其加到右子树节点个数,即:()+1(根)上;若左右子树高度相等,说明左子树部分是满二叉树,递归计算右子树(必为完全二叉树)的节点个数,即:( ) +1(根)上。
package algorithm.section5;
public class CompleteTreeNodeNumber {
public static class Node{
public int value;
public Node left;
public Node right;
public Node(int value){
this.value = value;
}
}
public static int complete(Node head){
if (head == null) return 0;
int lHeight = getHeight(head.left);
int rHeight = getHeight(head.right);
if (rHeight < lHeight) return (int)Math.pow(2, rHeight) - 1 + 1 + complete(head.left);
else return (int)Math.pow(2, lHeight) - 1 + 1 + complete(head.right);
}
public static int getHeight(Node head){
int h = 0;
while (head != null){
h++;
head = head.left;
}
return h;
}
public static void main(String[] args){
Node head = new Node(1);
head.left = new Node(2);
head.right = new Node(3);
head.left.left = new Node(4);
head.left.right = new Node(5);
head.right.left = new Node(6);
System.out.println(complete(head));
}
}