은 내가 완전한 이진 트리에서 노드의 수를 계산에 사소한 해결책을 가지고 있습니다. 그러나 각 노드를 방문해야하므로 비효율적이라는 것을 알고 있습니다.각 노드를 방문하지 않고 완전한 이진 트리의 노드 수를 계산하는 방법은 무엇입니까? 나는 이것을 이해</p> <pre><code>public int countNodes(TreeNode root) { if (root == null) { return 0; } return 1 + countNodes(root.left) + countNodes(root.right); } </code></pre> <p>:
public int countNodes(TreeNode root) {
if(root==null)
return 0;
int left = getLeftHeight(root)+1;
int right = getRightHeight(root)+1;
if(left==right){
return (2<<(left-1))-1; //having a hard time here
}else{
return countNodes(root.left)+countNodes(root.right)+1;
}
}
public int getLeftHeight(TreeNode n){
if(n==null) return 0;
int height=0;
while(n.left!=null){
height++;
n = n.left;
}
return height;
}
public int getRightHeight(TreeNode n){
if(n==null) return 0;
int height=0;
while(n.right!=null){
height++;
n = n.right;
}
return height;
}
나는 이것을 이해하지만 난 상태 경우 (leftHeight == rightHeight을) 이해 완전히 확실하지 않다 : 나는 온라인으로 볼 다른 해결책이있다. 이게 어떻게 작동합니까? 또한, 누군가 비트 연산과 왜 이것이 작동하는지 이유를 설명해 주시겠습니까? 비트 연산자에 익숙하지 않아요. 어쩌면, 누군가가 비트가없는 코드로 그 상태를 대체 할 수 있다면, 그것은 완벽 할 것입니다.
저자는 멍청하다. '2 << (left-1)'은'1 << left'로 단순화 될 수 있습니다. – Bohemian