Question
给定一棵完全二叉树(complete binary tree)的根结点,统计该树的结点总数。
提示:使用O(n)的递归算法统计二叉树的结点数是一种显而易见的方法,此题中请利用完全二叉树的性质,想出效率更高的算法。
Solution
Similar to binary search, O(lgn) complexity.
The idea is, sum up 1 branch of nodes at a time. Do it recursively. The following code is refactored and written by me.
Code
read it from here
//使用TreeNodeUtil.getLeftChildNode(TreeNode)获得左儿子结点
//使用TreeNodeUtil.getRightChildNode(TreeNode)获得右儿子结点
//使用TreeNodeUtil.isNullNode(TreeNode)判断结点是否为空
public class CountCompleteBinayTreeNodes {
public int countNodes(TreeNode root) {
if (TreeNodeUtil.isNullNode(root)) {
return 0;
}
int hl = height(TreeNodeUtil.getLeftChildNode(root));
int hr = height(TreeNodeUtil.getRightChildNode(root));
if (hl == hr) {
return (int) Math.pow(2, hl) + countNodes(TreeNodeUtil.getRightChildNode(root));
} else {
return (int) Math.pow(2, hr) + countNodes(TreeNodeUtil.getLeftChildNode(root));
}
}
private int height(TreeNode root) {
int count = 0;
while (!TreeNodeUtil.isNullNode(root)) {
root = TreeNodeUtil.getLeftChildNode(root);
count++;
}
return count;
}
}