题目描述
Given a complete binary tree, count the number of nodes.
Note:
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.
题目大意
求一棵完全二叉树的结点个数。
示例
E1
解题思路
Solution1:
用一个队列保存二叉树每层的结点数,每pop一个结点便使得结果自加一。
Solution2:
利用递归的特性,每次将将当前结点的左右子结点递归给函数,在叶结点处返回0 。
复杂度分析
时间复杂度:O(N)
空间复杂度:O(N)
代码1
/** * 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) { long long res = 0; if(root == NULL) return res; queue<TreeNode*> level; // 将根结点入队列 level.push(root); // 若当前结点的左右子节点存在,将其入队列,将当前结点出队列,结果加一 while(!level.empty()) { TreeNode* tmp = level.front(); if(tmp->left) level.push(tmp->left); if(tmp->right) level.push(tmp->right); level.pop(); ++res; } return res; } };
代码2
/** * 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) { // 若当前结点为叶节点,则返回0 if(!root) return 0; // 查找当前结点的子结点是否都是满二叉树,若是则不用继续递归,直接返回结果 int hl=0, hr=0; TreeNode *l=root, *r=root; while(l) {hl++;l=l->left;} while(r) {hr++;r=r->right;} if(hl==hr) return pow(2,hl)-1; // 若不是,则需要进一步进行递归 return 1+countNodes(root->left)+countNodes(root->right); } };