1. 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 一般的计算节点数目方法,count(root) = 1 + count(root->left) + count(root->left)

class Solution {
public:
int countNodes(TreeNode* root) {
if(root == NULL)return 0;
return 1 + countNodes(root->left) + countNodes(root->right);
}
}

解法2 先序/中序/后序遍历一次

class Solution {
public:
int countNodes(TreeNode* root) {
int ans = 0;
pre(root, ans);
return ans;
}
void pre(TreeNode *root, int &ans){
if(root == NULL)return;
ans++;
pre(root->left, ans);
pre(root->right, ans);
}
};

解法3 考虑到完全二叉树的特点:对于每一个节点来说,总有一边是满二叉树,高度为\(d\)满二叉树共有\(2^d-1\)个节点

class Solution {
public:
int countNodes(TreeNode* root) {
int l_h = get_left_h(root);
int r_h = get_right_h(root);
if(l_h == r_h)return pow(2, l_h) - 1;
return 1 + countNodes(root->left) + countNodes(root->right);
}
int get_left_h(TreeNode *root){
int d = 0;
while(root){
d++;
root = root->left;
}
return d;
}
int get_right_h(TreeNode *root){
int d = 0;
while(root){
d++;
root = root->right;
}
return d;
}
};

解法4 考虑完全二叉树的特点:只有最后一层是不满的,采用二分查找确定是从哪里分割的,即寻找第一个没有出现在叶子节点中的节点编号

  • 如何判断一个叶子节点是否存在

    将叶子节点编号为\([0, 1, ..., 2^d -1]\),根节点将叶子节点分成了\([0, \frac{2^d-1}{2}-1]\)和\([\frac{2^d-1}{2}, 2^d-1]\)两部分,查找编号为idx的叶子时:

    • idx <= mid, root = root->left
    • idx > mid, root = root->right

  • 如何查找第一个不存在的叶子结点的编号

    假设第一个不存在的叶子结点在区间\([l, r]\)中,判断中点\(mid = (l + r) / 2\)

    • exist(mid) == true :中点及左侧区间被排除
    • exist(mid) == false : 右侧区间被排除
class Solution {
public:
int countNodes(TreeNode* root) {
int l_h = get_left_h(root);
int r_h = get_right_h(root);
if(l_h == r_h)return pow(2, r_h) - 1;
int l = 0, r = pow(2, r_h) - 1;
while(l < r){
int mid = (l + r) / 2;
if(exist(mid, r_h, root)){
l = mid + 1;
}else{
r = mid;
}
}
return pow(2, r_h) + l-1;
}
bool exist(int val, int d, TreeNode *root){
int l = 0, r = pow(2, d)-1;
TreeNode *cur = root;
for(int i = 0; i < d; ++i){
int mid = (l + r) / 2;
if(val <= mid){
r = mid;
cur = cur->left;
}else{
l = mid + 1;
cur = cur->right;
}
}
return cur != NULL;
}
int get_left_h(TreeNode *root){
int d = 0;
while(root){
d++;
root = root->left;
}
return d;
}
int get_right_h(TreeNode *root){
int d = 0;
while(root){
d++;
root = root->right;
}
return d;
}
};

【刷题-LeetCode】222. Count Complete Tree Nodes的更多相关文章

  1. 【刷题笔记】LeetCode 222. Count Complete Tree Nodes

    题意 给一棵 complete binary tree,数数看一共有多少个结点.做题链接 直观做法:递归 var countNodes = function(root) { if(root===nul ...

  2. [LeetCode] 222. Count Complete Tree Nodes 求完全二叉树的节点个数

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

  3. Java for LeetCode 222 Count Complete Tree Nodes

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

  4. (medium)LeetCode 222.Count Complete Tree Nodes

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

  5. leetcode 222.Count Complete Tree Nodes

    完全二叉树是从左边开始一点点填充节点的,因此需要计算所有的节点的个数. 则分别从左边和右边来进行传递的,当左右是完全二叉树的时候,其节点个数就是pow(2,h)-1. /** * Definition ...

  6. [leetcode]222. Count Complete Tree Nodes完全二叉树的节点数

    /* 满二叉树的特点是2^n-1,对于完全二叉树,一个node如果左右子树深度相同,那么 是一个满二叉树.如果不是,那就把node算上,继续往下看,下边的可能是满二叉树 由于完全二叉树中有一些子满二叉 ...

  7. 【LeetCode】222. Count Complete Tree Nodes 解题报告(Python)

    [LeetCode]222. Count Complete Tree Nodes 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个 ...

  8. leetcode 958. Check Completeness of a Binary Tree 判断是否是完全二叉树 、222. Count Complete Tree Nodes

    完全二叉树的定义:若设二叉树的深度为h,除第 h 层外,其它各层 (1-h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树. 解题思路:将树按照层进行遍历,如果 ...

  9. LeetCode OJ 222. Count Complete Tree Nodes

    Total Accepted: 32628 Total Submissions: 129569 Difficulty: Medium Given a complete binary tree, cou ...

随机推荐

  1. 背水一战——CSP2021/NOIP2021 游记

    洛谷 version 转载本文章的其他链接: 1(S00021 提供) 2(Ew_Cors 提供) \[\texttt{2021.9.10} \] 终于开坑了. 笑死,初赛根本还没开始复习,反正初赛也 ...

  2. java 输入输出IO流 字符流 FileWriter FileReader

    为什么要使用字符流 当使用字节流读取文本文件时,可能会有一个小问题.就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储.所以Java提供一些字符流类,以字符为单位读写 ...

  3. mysql数据库总结笔记

    一.安装和配置数据库: 下载mysql地址:https://dev.mysql.com/downloads/mysql/ windows下载的版本是installer msi版本:https://de ...

  4. Flink使用IDEA进行jar打包

    pom文件增加 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>mav ...

  5. worksocket使用Nginx进行反向代理

    配置文件 map $http_upgrade $connection_upgrade { default upgrade; '' close; } upstream weoskceturl{ serv ...

  6. 【LeetCode】1023. Binary String With Substrings Representing 1 To N 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  7. 【LeetCode】73. Set Matrix Zeroes 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 原地操作 新建数组 队列 日期 题目地址:https ...

  8. 【剑指Offer】求1+2+3+...+n 解题报告(C++)

    [剑指Offer]求1+2+3+-+n 解题报告(C++) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题 ...

  9. Frp内网穿透搭建,家庭主机对外提供接口,支持ssh访问

    Frp内网穿透搭建,家庭主机对外提供接口,支持ssh访问 1.使用场景: 需求1.家中服务器 ubuntu 主机,跑接口服务,需要对外暴漏, 需求2.同时需要在外网ssh远程 ​ 关键词: frp内网 ...

  10. Nginx 简单配置反向代理

    nginx 配置反向代理,转发请求到另一个域名 在server中加入 location /${alias} { proxy_buffer_size 128k; proxy_buffers 32 32k ...