222. Count Complete Tree Nodes
2016-09-06 16:29
351 查看
题:
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.
tags: binary search
A 最直观的解法。dfs将树中每个节点都遍历并计数。时间复杂度O(N)。
但是超时了。
B tags是binary search。每一步,我们都可以确定左或者右子树的节点数。具体他,可以判断左右节点最最左边的层数是否相同,如果相同,则左子树为满二叉树,若不同则右子树为满二叉树。满二叉树的节点数容易计算,然后再递归地求解非满二叉树的节点数。
求解本题还要注意两点:
1)用<<代替pow(),算法能快100多ms。为啥快这么多?
2)在对子树递归时,将上次计算的树的高度用参数传入,避免不必要的计算。也能快上个几十ms。
class Solution {
public:
int countNodes(TreeNode*& root) {
return dfs(root, 0);
}
int dfs(TreeNode*& root, int l){
if(root==NULL) return 0;
int r = 0;
TreeNode* node = root->left;
if(l==0){
while(node!=NULL){
l++;
node = node->left;
}
}
node = root->right;
while(node!=NULL){
r++;
node = node->left;
}
if(l==r) return (1<<l)+dfs(root->right, r-1);
else return (1<<r)+dfs(root->left, l-1);
}
};
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.
tags: binary search
A 最直观的解法。dfs将树中每个节点都遍历并计数。时间复杂度O(N)。
但是超时了。
B tags是binary search。每一步,我们都可以确定左或者右子树的节点数。具体他,可以判断左右节点最最左边的层数是否相同,如果相同,则左子树为满二叉树,若不同则右子树为满二叉树。满二叉树的节点数容易计算,然后再递归地求解非满二叉树的节点数。
求解本题还要注意两点:
1)用<<代替pow(),算法能快100多ms。为啥快这么多?
2)在对子树递归时,将上次计算的树的高度用参数传入,避免不必要的计算。也能快上个几十ms。
class Solution {
public:
int countNodes(TreeNode*& root) {
return dfs(root, 0);
}
int dfs(TreeNode*& root, int l){
if(root==NULL) return 0;
int r = 0;
TreeNode* node = root->left;
if(l==0){
while(node!=NULL){
l++;
node = node->left;
}
}
node = root->right;
while(node!=NULL){
r++;
node = node->left;
}
if(l==r) return (1<<l)+dfs(root->right, r-1);
else return (1<<r)+dfs(root->left, l-1);
}
};
相关文章推荐
- 二分搜索专题2-在有序二维数组中搜索一个元素
- 判断是否为完全二叉树
- NYOJ 586 疯牛
- 欢迎使用CSDN-markdown编辑器
- 完全二叉树求叶子节点个数
- PAT|1064. Complete Binary Search Tree
- 数据结构之伸展树
- Search Insert Position
- Cable master(假定一个解并判断是否可行)(POJ NO.1064)
- 【1】【二分搜索】CodeForces 492D Vanya and Computer Game
- leetcode--CountCompleteTreeNodes
- 【分治法】分治法与二分搜索,棋盘覆盖问题
- poj 2456 Aggressive cows
- Dropping Balls
- 【Jason's_ACM_解题报告】Dropping Balls
- poj 3662 最短路
- 二叉树总结
- 二分搜索的java源码实践
- Cable master
- 1001