题目
Given a complete binary tree, count the number of nodes.
notice:
(In a complete binary tree every level, except possibly the last, is completely filled, and all nodes in the last level are as far left as possible. It can have between 1 and 2h nodes inclusive at the last level h.)
思路一:报超时错误
得到树的前序遍历,即得到了节点的个数。
实现代码如下:
public class Solution {
List<TreeNode> list = new ArrayList<TreeNode>();
public int countNodes(TreeNode root) {
preOrder(root);
return list.size();
}
private void preOrder(TreeNode root) {
if(root==null){
return ;
}
list.add(root);
preOrder(root.left);
preOrder(root.right);
}
}
由于这种思路完全没有利用完成二叉树的特点,报超时是正常的,下面我们需要寻找更好的思路来完成。
思路二
思路来自于:https://discuss.leetcode.com/topic/21317/accepted-easy-understand-java-solution
确实经典,自己想不到!!!
public class CountNodes_v2 {
public int countNodes(TreeNode root) {
if(root == null){
return 0;
}
int leftDepth = leftDepth(root);
int rightDepth = rightDepth(root);
if(leftDepth == rightDepth){
return (1<<leftDepth)-1;
}
else{//如果不相等,则递归到左右子树的节点数+1.
return 1 + countNodes(root.left) + countNodes(root.right);
}
}
public int leftDepth(TreeNode root){
int depth = 0;
while(root!=null){
depth ++;
root = root.left;
}
return depth;
}
public int rightDepth(TreeNode root){
int depth = 0;
while(root!=null){
depth ++;
root = root.right;
}
return depth;
}
}