算法题解-完全二叉树的节点个数

简介: 算法题解-完全二叉树的节点个数

题目


给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。

输入: root = [1,2,3,4,5,6]
输出: 6


题解


第一种


我们在函数中先判断root是否为空,如果是那么我们直接返回0,然后我们声明了两个变量h1和h2,并将其设置为0,然后我们声明了两个指针l和r,并将它们都指向根节点,接下来我们使用循环去计算左子树的高度,在循环中,我们将指针l不断地指向左子节点,每次循环h1的值加1,直到l为空,这样h1的值就代表了左子树的高度,然后我们使用另一个循环来计算右子树的高度,在循环中,我们将指针r不断地指向右子节点,每次循环h2的值加1,直到r为空,这样h2的值就代表了右子树的高度,然后我们使用条件判断来比较左右子树的高度h1和h2是否相等,如果相等则说明该二叉树是一棵满二叉树,我们直接返回这个值即可,如果左右子树的高度不相等则说明该二叉树不是满二叉树,我们这里需要递归地计算左子树和右子树的节点数量,将它们相加后再加上根节点本身,最后返回这个值即可

var countNodes = function(root) {
    if(!root) return 0
    let h1 = 0, h2 = 0
    let l = root, r = root
    while(l) {
        l = l.left
        h1++
    }
    while(r) {
        r = r.right
        h2++
    }
    if(h1===h2) return Math.pow(2, h1)-1
    return countNodes(root.left)+countNodes(root.right)+1
};


第二种


我们在函数中先判断root是不是空,如果是则直接返回0,然后我们声明了一个空数组que,用于存储待处理的节点,然后我们将根节点root推入数组que中,接下来我们声明了一个变量result,用于记录节点数量,将值初始化为0, 然后我们使用循环去遍历数组que,直到数组为空为止,在循环中,我们首先获取当前数组que的长度,存储在变量size中,然后我们使用循环去遍历当前层级的节点,在循环中,我们从数组que的头部取出一个节点,赋值给变量node,并将节点数量result加1,然后我们去判断当前节点是否有左子节点和右子节点,如果有左子节点,我们则将左子节点推入数组que中,如果有右子节点,我们将右子节点推入数组que中,这样我们就完成了对当前层级节点的处理,同时将下一层级的节点推入数组que中,当数组que为空时,则说明我们已经遍历了所有节点,这个时候我们返回节点数量result即可

var countNodes = function(root) {
    if (!root) return 0;
    const que = [];
    que.push(root);
    let result = 0;
    while (que.length){
        const size = que.length;
        for (let i=0; i<size; i++){
            node = que.shift();
            result++;
            node.left && que.push(node.left);
            node.right && que.push(node.right);
        }
    }
    return result;
}
相关文章
|
2月前
|
算法
【优选算法专栏】专题九:链表--------两两交换链表中的节点
【优选算法专栏】专题九:链表--------两两交换链表中的节点
20 0
|
2月前
|
算法 Java
算法:Java计算二叉树从根节点到叶子结点的最大路径和
算法:Java计算二叉树从根节点到叶子结点的最大路径和
|
2月前
|
NoSQL 算法 安全
Redlock 算法-主从redis分布式锁主节点宕机锁丢失的问题
Redlock 算法-主从redis分布式锁主节点宕机锁丢失的问题
189 0
|
2月前
|
存储 JavaScript 算法
TypeScript算法专题 - blog4 - 单链表节点的两-两翻转(两两一组逆序)
TypeScript算法专题 - blog4 - 单链表节点的两-两翻转(两两一组逆序)
34 0
|
25天前
|
存储 NoSQL 算法
Redis集群,集群的概念 三种主流分片方式1.哈希求余 一致性哈希算法:方案三:哈希槽分区算法问题一Redis集群是最多有16384个分片吗问题二:为什么是16384个,集群扩容:1.新的主节点
Redis集群,集群的概念 三种主流分片方式1.哈希求余 一致性哈希算法:方案三:哈希槽分区算法问题一Redis集群是最多有16384个分片吗问题二:为什么是16384个,集群扩容:1.新的主节点
|
5天前
|
算法
【数据结构与算法 刷题系列】求带环链表的入环节点(图文详解)
【数据结构与算法 刷题系列】求带环链表的入环节点(图文详解)
|
5天前
|
算法 C语言
【数据结构与算法 经典例题】返回单链表的倒数第 k 个节点
【数据结构与算法 经典例题】返回单链表的倒数第 k 个节点
|
13天前
|
算法
二叉树删除节点算法---递归
二叉树删除节点算法---递归
|
2月前
|
存储 算法 IDE
数据结构与算法⑯(第四章_下)二叉树的层序遍历+判断完全二叉树+一道OJ
数据结构与算法⑯(第四章_下)二叉树的层序遍历+判断完全二叉树+一道OJ
33 1
|
24天前
|
算法
数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)
数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)
16 0