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. LuoguP7019 [NWRRC2017]Auxiliary Project 题解

    Update \(\texttt{2021.6.24}\) 修改了一处格式上的错误和一处笔误. Content 已知用 LED 灯来显示 \(0\sim9\) 这十个数字分别需要 \(6,2,5,5, ...

  2. java 网络编程基础 TCP/IP协议:服务端ServerSocket;客户端Socket; 采用多线程方式处理网络请求

    1.Java中客户端和服务器端通信的简单实例 Java中能接收其他通信实体连接请求的类是ServerSocket,ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接,它将一 ...

  3. java web 404错误页面配置

    java web 404错误页面配置:注意红框的地方,在工程的web.xml文件里的最开头加入如下的内容便可,但是也有问题,针对以.action后缀名和.jsp后缀名不起作用, 因为后面配置了一些拦截 ...

  4. C# Dispose模式

    需要明确一下C#程序(或者说.NET)中的资源.简单的说来,C#中的每一个类型都代表一种资源,而资源又分为两类: 托管资源:由CLR管理分配和释放的资源,即由CLR里new出来的对象: 非托管资源:不 ...

  5. JAVA执行cmd命令方法

    package com.cmd; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStre ...

  6. 分享一下java需要的一些技术

    1.前言 you are 大哥,老衲很佩服你们_.还是一样的,有我联系方式的人,哪些半吊子不知道要学习哪些技术,一天让我整知识点,老衲也有事情做的,哪有那么多时间来一直搞知识点啊,我的博客更新很慢的, ...

  7. spoj-ORDERS - Ordering the Soldiers

    ORDERS - Ordering the Soldiers As you are probably well aware, in Byteland it is always the military ...

  8. Codeforces 919D:Substring(拓扑排序+DP)

    D. Substring time limit: per test3 seconds memory limit: per test256 megabytes inputstandard: input ...

  9. Accelerating Deep Learning by Focusing on the Biggest Losers

    目录 概 相关工作 主要内容 代码 Accelerating Deep Learning by Focusing on the Biggest Losers 概 思想很简单, 在训练网络的时候, 每个 ...

  10. Type-C扩展芯片|Type-C扩展方案|CSCapstone|扩展坞方案选型

    一.关于Capstone Capstone科技于2018年8月在台湾成立.团队成员的多样性将硅谷和台湾的才华横溢的人联系在一起,以进行协作和取得优越成就. Capstone科技是由一个经验丰富的研发团 ...