设计一个算法:统计一棵二叉树中所有叶结点的数目及非叶结点的数目。
//计算总结点个数 int nodeNums(BiTree* root) { if (!root) return 0; else return nodeNums(root->left) + nodeNums(root->right) + 1; } //计算度数为2的结点总数 int twoChildNodes(BiTree* root) { if (!root) return 0; if (root->left && root->right) return twoChildNodes(root->left) + twoChildNodes(root->right) + 1; else return twoChildNodes(root->left) + twoChildNodes(root->right); } //计算度数为1的结点总数 int oneChildNodes(BiTree* root) { if (!root) return 0; bool only_left = root->left && !root->right; bool only_right = root->right && !root->left; if (only_left) return 1 + oneChildNodes(root->left); else if (only_right) return 1 + oneChildNodes(root->right); else return oneChildNodes(root->left) + oneChildNodes(root->right); } //计算叶子结点个数 int leaves(BiTree* root) { if (!root) return 0; if (!root->left && !root->right) return 1; return leaves(root->left) + leaves(root->right); }
Master公式是常用来解决递归问题时间复杂度的通用公式。公式可以直接记为:T(N) = a*T(N / b) + O (Nd)然后按照下表对应计算复杂度即可:
条件 | 时间复杂度 |
log(b,a) < d | O(Nd) |
log(b,a) > d | O(Nlog(b,a)) |
log(b,a) = d | O((Nd) * logN) |