222. Count Complete Tree Nodes
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.
Example:
Input:
1
/ \
2 3
/ \ /
4 5 6
Output: 6
方法1: recursion
YRB: https://www.cnblogs.com/yrbbest/p/4993469.html
思路:
任何数都可以在O(n)的时间内得到count,但是这道题可不可以利用complete BST 的性质加速一些呢?关键在于如果缺节点一定从右边开始缺。所以求一颗complete BST的高度,延最左路径找就可以。full BST的定义是节点数为2^h - 1。利用如下的性质递归求半边解:
- 如果leftHeight == rightHeight, 左子树是full BST, 右子树是complete BST.
- 如果leftHeight != rightHeight, 左子树是complete BST, 右子树是full BST.
易错点
- 注意每次返回结果 (1 << leftHeight) + countNodes(root.right): 2 ^ leftHeight - 1 + 1 + countNodes(root.right) 。这里+1是因为把根节点也算进去,化简一下就是 (1 << leftHeight) + countNodes(root.right)。
Complexity
Time complexity: O(logn * logn) , 每一层需要求一下深度,需要往下递归调用深度的次数。
Space complexity: O(logn): 栈的深度
/**
* 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 leftHeight = getHeight(root -> left);
int rightHeight = getHeight(root -> right);
if (leftHeight == rightHeight) {
return (1 << leftHeight) + countNodes(root -> right);
}
else {
return countNodes(root -> left) + (1 << rightHeight);
}
}
int getHeight(TreeNode* root){
if (!root) return 0;
return getHeight(root -> left) + 1;
}
};