隐隐约约感觉用到了剪枝的思想。
第一步:首先计算一路向左的深度,一路向右的深度
第二步:如果相等,则为满二叉树,返回2^depth - 1;
第三步:如果不等,则用递归函数实现递推关系
树的节点数 = 左子树的节点数 + 右子树的节点数 + 1
其中第二步就是对第三步的优化,我们如果不加思考一直使用递推也是可以的,只不过时间比较长,会出现LTE。
使每个子函数尽可能早的返回是此次优化的背后思想。但这到底是不是剪枝尚不清楚,但似乎有那么点味道。 |
c++代码如下
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int countNodes(TreeNode* root) {
if(root == NULL) return 0;
int leftDep = 0;
TreeNode *p = root;
while(p->left != NULL) { leftDep++; p = p->left; }
int rightDep = 0;
p = root;
while(p->right != NULL) { rightDep++; p = p->right; }
if(leftDep == rightDep) return (1 << (leftDep + 1)) - 1;
return countNodes(root->left) + countNodes(root->right) + 1;
}
};