タイトルアドレス:
https://www.lintcode.com/problem/count-complete-tree-nodes/description
完全な二分木が与えられた場合、ノードの数を見つけます。
完全二分木の左右のサブツリーは必ず完全二分木であるため、分割統治法が利用できると考えられる。まず、2つのポインタを使用して左端と右端に移動し、バイナリツリー全体の左端と右端の深さが等しいかどうかを確認します。等しい場合は、バイナリツリーがいっぱいでノードの数を使用できることを意味します。 で計算します。それ以外の場合は、2つのサブツリーのノード数を再帰的に解決してから要約できます。コードは次のとおりです。
public class Solution {
/**
* @param root: root of complete binary tree
* @return: the number of nodes
*/
public int countNodes(TreeNode root) {
// write your code here
if (root == null) {
return 0;
}
TreeNode left = root, right = root;
int lDepth = 0, rDepth = 0;
while (left != null) {
lDepth++;
left = left.left;
}
while (right != null) {
rDepth++;
right = right.right;
}
if (lDepth == rDepth) {
return (1 << lDepth) - 1;
} else {
// 分治
return countNodes(root.left) + countNodes(root.right) + 1;
}
}
}
class TreeNode {
int val;
TreeNode left, right;
TreeNode(int x) {
val = x;
}
}
スペースの複雑さ 、時間の複雑さ 。スペースの複雑さはわかりやすい 、時間の複雑さは次のように考えることができます。同じ再帰の深さの場合、片側だけが再帰を継続し、もう一方の側は式を直接適用するため、最悪の場合、再帰の各層は深さを通過する必要があります、したがって、合計時間の複雑さは 。