leetcode 222. 完全二叉树的节点个数

举报
兔老大 发表于 2021/04/23 01:54:48 2021/04/23
2.2k+ 0 0
【摘要】 给出一个完全二叉树,求出该树的节点个数。 说明: 完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。 示例: 输入:      1    / \ &nb...

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

说明:

完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。

示例:

输入: 
    1
   / \
  2   3
 / \  /
4  5 6

输出: 6

思路:

求完全二叉树的结点个数


      /**
       * Definition for a binary tree node.
       * public class TreeNode {
       * int val;
       * TreeNode left;
       * TreeNode right;
       * TreeNode(int x) { val = x; }
       * }
       */
      class Solution {
       //返回结点个数
     	public int countNodes(TreeNode head) {
     		if (head == null)return 0;
     		return bs(head, 1, mostLeftLevel(head, 1));
      	}
      //返回根为node,当前层数为l,总深度为h的结点个数
     	public int bs(TreeNode node, int l, int h) {
     		if (l == h) {
     			return 1;
      		}
     		if (mostLeftLevel(node.right, l + 1) == h) { //右子树最深一行最左为空
     			return (1 << (h - l)) + bs(node.right, l + 1, h); //右bs+左子树结点个数
      		} else { //右子树最深一行最左不为空
     			return (1 << (h - l - 1)) + bs(node.left, l + 1, h);//左bs+右子树结点个数
      		}
      	}
      //计算树的高度
     	public int mostLeftLevel(TreeNode node, int level) {
     		while (node != null) {
      			level++;
      			node = node.left;
      		}
     		return level - 1;
       }
      }
  
 

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/104177268

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。