leetcode 222. Count Complete Tree Nodes

来源:互联网 发布:企业qq群发软件 编辑:程序博客网 时间:2024/06/05 09:14

222. Count Complete Tree Nodes


Given a complete binary tree, count the number of nodes.

Definition of a complete binary tree from Wikipedia:
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.


对于一个节点node,计算它最左端的节点到node的深度为leftDepth,计算它最右端的节点到node的深度是rightDepth;
如果leftDepth和rightDepth相等,那么以node为根节点的树是一棵满二叉树,此时以node为根节点的树的节点个数是pow(2,leftDepth)-1;
如果leftDepth和rightDepth不相等,递归求解node的左子树的节点数和右子树的节点数。注意此时左子树必定是满二叉树了。
从这道题中学到的一个很深的教训是对于树的问题,递归是一个很好的利器,因为树本身就是用递归来定义的。


/** * 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)              return 0;                            int leftDepth = 0;          int rightDepth = 0;          for (TreeNode* node = root; node != NULL; node = node->left)              leftDepth++;          for (TreeNode* node = root; node != NULL; node = node->right)              rightDepth++;          if (leftDepth == rightDepth)              return (1<<leftDepth)-1;          else              return countNodes(root->left) + countNodes(root->right) + 1;            }};