給定完全二叉樹根節點,求節點總數。完全二叉樹:除最後一層外每層滿,最後一層靠左排列。要求優於 O(n)。
完全二叉樹若左右子樹高度相等,則為滿二叉樹,節點數 = 2^h - 1。否則遞歸計算左右子樹節點數 + 1。
leftH(沿左子鏈)和右高 rightH(沿右子鏈)。(1<。 1 + countNodes(root.left) + countNodes(root.right)。每次遞歸至少一邊是滿樹,可直接計算,深度 O(log n),每層計算高度 O(log n),總時間 O(log² n)。
public int countNodes(TreeNode root) {
if (root == null) return 0;
int leftH = 0, rightH = 0;
TreeNode p = root;
while (p != null) { leftH++; p = p.left; }
p = root;
while (p != null) { rightH++; p = p.right; }
if (leftH == rightH) return (1 << leftH) - 1;
return 1 + countNodes(root.left) + countNodes(root.right);
}
時間 O(log² n),空間 O(log n) 遞歸棧。遠優於 O(n) 遍歷。