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

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

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

说明:

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

示例:

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

输出: 6

思路:

求完全二叉树的结点个数


  
  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode(int x) { val = x; }
  8. * }
  9. */
  10. class Solution {
  11. //返回结点个数
  12. public int countNodes(TreeNode head) {
  13. if (head == null)return 0;
  14. return bs(head, 1, mostLeftLevel(head, 1));
  15. }
  16. //返回根为node,当前层数为l,总深度为h的结点个数
  17. public int bs(TreeNode node, int l, int h) {
  18. if (l == h) {
  19. return 1;
  20. }
  21. if (mostLeftLevel(node.right, l + 1) == h) { //右子树最深一行最左为空
  22. return (1 << (h - l)) + bs(node.right, l + 1, h); //右bs+左子树结点个数
  23. } else { //右子树最深一行最左不为空
  24. return (1 << (h - l - 1)) + bs(node.left, l + 1, h);//左bs+右子树结点个数
  25. }
  26. }
  27. //计算树的高度
  28. public int mostLeftLevel(TreeNode node, int level) {
  29. while (node != null) {
  30. level++;
  31. node = node.left;
  32. }
  33. return level - 1;
  34. }
  35. }

 

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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