每日算法之求完全二叉树的结点个数

作者: 树獭非懒 | 来源:发表于2018-12-13 12:41 被阅读1次

参考 LeetCode 222题

题目:求一个完全二叉树的结点总数

leetcode222.png

解析:要解决这道题,必须要清楚完全二叉树的特点

完全二叉树:除了最后一层,所有层的节点数达成最大,与此同时,最后一层的所有结点都在左侧。

满二叉树:所有层的结点数都达到最大

解法一:递归法

1.计算出左子树和右子树的高度h

2.如果左子树和右子树的高度一样,则它是一棵满二叉树,结点个数就是(2^h)-1个

3.如果高度不一样,就要递归分别求出左子树和右子树的结点数。结点总数=左子树+右子树+1(根节点)

public int countNodes(TreeNode root) {
    if(root == null) return 0;

    int height = 1;
    TreeNode left = root.left, right = root.right;
    while(left != null && right != null) {
        height++; 
        left = left.left;
        right = right.right;
    }
    
    return left == right ? (1 << height ) - 1 : 1 + countNodes(root.left) + countNodes(root.right);
} 

解法二:迭代法

1.先计算出树的高度h和计算右子树的高度

2.比较右子树是否和树的高度小1来判断,左子树和右子树是不是有相同的高度

3.如果高度相同,那么树的最后一行的最后一个节点在右子树中,而左子树是高度为h-1的整棵树。所以我们取左子树的2^h-1节点数加上右子树中的递归节点数+1(根节点)

4.如果高度不同,那么最后一行树的最后一个节点在左子树中,而右子树是高度为h-2的整棵树。所以我们取右子树的2^(h-1)-1节点加上左子树中的递归节点数+1(根节点)。

public int countNodes2(TreeNode root) {
        int nodes=0,h=height(root);
        System.out.println("---树的最大高度是----"+h);
        while(root!=null){
            if(height(root.right)==h-1){
                nodes+=1<<h;
                root=root.right;
            }else{
                nodes+=1<<h-1;
                root=root.left;
            }
            h--;
        }
        return nodes;
    }

private int height(TreeNode root) {
        return root==null?-1:1+height(root.left);
    }

相关文章

  • 每日算法之求完全二叉树的结点个数

    参考 LeetCode 222题 题目:求一个完全二叉树的结点总数 解析:要解决这道题,必须要清楚完全二叉树的特点...

  • 满二叉树 层数k 总结点数2^k-1 层结点数2^(k-1)总结点数=总分支数+1已知树每个度的结点个数,求完全二...

  • LeetCode:完全二叉树节点个数

    222. 完全二叉树的节点个数 思路: 如果是完全二叉树,则其结点的个数为 2^h-1;h为二叉树高度。对根结点来...

  • 数据结构题目38:求二叉树的深度

    题目:已知二叉树采用二叉链表存储结构,根结点所在链结点的地址为T,写一递归算法,求该二叉树的深度。 (一)递归算法...

  • 堆 | 定义、操作、堆排序

    参考:胡凡,曾磊《算法笔记》 定义 堆是一棵完全二叉树。 完全二叉树:结点数量n,叶子结点数ceiling(n/2...

  • 面试题

    近期算法题记录 始于2021.08.05 一、字节跳动 算法题:二叉树,根结点到每个叶子结点的值算一个数,所有的值...

  • 数据结构题目37:求该二叉树中叶结点的数目

    题目:已知二叉树采用二叉链表存储结构,根结点所在链结点的地址为T,写一递归算法,求该二叉树中叶结点的数目。 具体算...

  • 小朋友学数据结构(3):二叉树的建立和遍历

    一、基本概念 二叉树:每个结点的子结点个数不大于2的树,叫做二叉树。根结点:最顶部的那个结点叫做根结点,根结点是所...

  • # 二叉树常见面试题

    阅读目录 翻转二叉树(输出二叉树的镜像)求二叉树中最远两个结点的距离二叉树的深度求二叉树中两个结点的最近公共祖先由...

  • 剑指 offer:38、二叉树的深度

    38. 二叉树的深度 题目描述 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树...

网友评论

    本文标题:每日算法之求完全二叉树的结点个数

    本文链接:https://www.haomeiwen.com/subject/rlivhqtx.html