递归三步:
1.确定递归函数的参数与返回值:参数即树的根节点,返回值树的节点个数,int类型。
2.确定递归终止条件:如果节点为空,就返回0,表示节点个数为0(当前层的视角)
3.确定单层递归逻辑:左右子树的节点个数加当前节点的个数1。
代码:
class Solution {
public:
int getNodesNum(TreeNode* cur) {
if (cur == NULL)return 0;
int left_num = getNodesNum(cur->left);
int right_num = getNodesNum(cur->right);
return left_num + right_num + 1;
}
int countNodes(TreeNode* root) {
return getNodesNum(root);
}
};
贴一个先开始写的错误代码:
我这里前面有一个判断cur==NULL了,我后面又来判断cur的左右子节点是否为空,这个就是没有掌握到递归的精髓,cur==NULL,递归下来其实就已经能够判断其左右子节点是否为空了。
class Solution {
public:
int getNodesNum(TreeNode* cur) {
if (cur == NULL)return 0;
int left_num;
int right_num;
if(cur->left_num!=NULL)
left_num = getNodesNum(cur->left);
if (cur->right_num != NULL)
right_num = getNodesNum(cur->right);
return left_num + right_num + 1;
}
int countNodes(TreeNode* root) {
return getNodesNum(root);
}
};