完全二叉树节点个数
A Complete Binary Tree (CBT) is a binary tree in which every level, except possibly the last, is completely filled, and all nodes are as far left as possible.
对于一颗二叉树,假设其深度为d(d>1)。除了第d层外,其它各层的节点数目均已达最大值,且第d层所有节点从左向右连续地紧密排列,这样的二叉树被称为完全二叉树;
换句话说,完全二叉树从根结点到倒数第二层满足完美二叉树,最后一层可以不完全填充,其叶子结点都靠左对齐。
A Perfect Binary Tree(PBT) is a tree with all leaf nodes at the same depth. All internal nodes have degree 2.
二叉树的第i层至多拥有个节点数;深度为k的二叉树至多总共有个节点数,而总计拥有节点数匹配的,称为“满二叉树”;
A Full Binary Tree (FBT) is a tree in which every node other than the leaves has two children.
换句话说,所有非叶子结点的度都是2。(只要你有孩子,你就必然是有两个孩子。)
通过上面的定义,我们可以看出二者的关系是,完美二叉树一定是完全二叉树,而完全二叉树不一定是完美二叉树。那么这道题给的完全二叉树就有可能是完美二叉树,若是完美二叉树,节点个数很好求,为2的h次方-1,h为该完美二叉树的高度。这道题可以用递归和非递归两种方法来解。我们先来看递归的方法,思路是分别找出以当前节点为根节点的左子树和右子树的高度并对比,如果相等,则说明是满二叉树,直接返回节点个数,如果不相等,则节点个数为左子树的节点个数加上右子树的节点个数再加1(根节点),其中左右子树节点个数的计算可以使用递归来计算,参见代码如下:
class Solution { public: int countNodes(TreeNode* root) { int hLeft = 0, hRight = 0; TreeNode *pLeft = root, *pRight = root; while (pLeft) { ++hLeft; pLeft = pLeft->left; } while (pRight) { ++hRight; pRight = pRight->right; } if (hLeft == hRight) return pow(2, hLeft) - 1; return countNodes(root->left) + countNodes(root->right) + 1; } };
//递归解释 class Solution { public: int countNodes(TreeNode* root) { int hLeft = leftHeight(root); int hRight = rightHeight(root); if (hLeft == hRight) return pow(2, hLeft) - 1; return countNodes(root->left) + countNodes(root->right) + 1; } int leftHeight(TreeNode* root) { if (!root) return 0; return 1 + leftHeight(root->left); } int rightHeight(TreeNode* root) { if (!root) return 0; return 1 + rightHeight(root->right); } };