第一次见这个题,看时间小于O(N)。。。。。

只能是二分啊。

但是怎么二分,条件是什么,真的想不到。

后来知道了,我们要找最深一层最右边那个结点。借此确定结点个数。

我们知道,满二叉树的结点个数和深度是有公式的,那么我们找到最后一层最右边的结点,其实就可以确定结点个数。

目标:找箭头指向的结点。

我们采用二分法:

1)找到右子树的最左结点

如果右子树深度为3(4-1),说明图中最后的1是存在的(说明最后一行最右结点一定来自右子树),否则

右子树深度为2!=4-1,不存在最后一行的结点。(说明最后一行最右结点一定来自左子树).

判断之后,如果是这种情况,我们排除了左子树,计算排除的结点个数(如图),并对右子树做相同的处理。

更新结点数(未被框起的部分,满二叉树公式+1)+1是根结点

对方框内重复此过程。

我们继续看右子树,发现右子树深度为1!=3-1.

说明最深层最右结点来自于左子树。所以对左子树重复上述过程

我们发现,右子树深度=1=2(整棵树深度)-1,说明最深层最右结点来自于右子树,所以对右子树重复此过程。

最终找到它

我们再回忆一下过程:

1)找到右子树最左节点,确定了深度,对右子树重复。

2)找到右子树最左节点,确定了深度,对左子树重复。

3)找到右子树最左节点,确定了深度,对右子树重复。

4)找到

过程中可以

1)把排除的部分全部加起来,

2)也可以记录每次的选择(向左还是向右),最终100010这种字符,其实就是最后一层的结点个数。

贴上方法1的全部代码:

public class Demo {public static class Node {public int value;public Node left;public Node right;public Node(int data) {this.value = data;}}
//返回结点个数public static int nodeNum(Node head) {if (head == null) {return 0;}return bs(head, 1, mostLeftLevel(head, 1));}
//返回根为node,当前层数为l,总深度为h的结点个数public static int bs(Node 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 static int mostLeftLevel(Node node, int level) {while (node != null) {level++;node = node.left;}return level - 1;}public static void main(String[] args) {Node head = new Node(1);head.left = new Node(2);head.right = new Node(3);head.left.left = new Node(4);head.left.right = new Node(5);head.right.left = new Node(6);System.out.println(nodeNum(head));}}

求完全二叉树的结点个数相关推荐

  1. day23【代码随想录】翻转二叉树、对称二叉树、相同的树、另一棵树的子树、完全二叉树的结点个数

    文章目录 前言 一.翻转二叉树(力扣226) 1.递归法 1.使用前序遍历 2.使用后序遍历 2.迭代法 1.层序遍历 二.对称二叉树(力扣101) 三.相同的树(力扣100) 四.另一棵树的子树(力 ...

  2. 求二叉树中结点个数代码java_求二叉树中第K层结点的个数

    一,问题描述 构建一棵二叉树(不一定是二叉查找树),求出该二叉树中第K层中的结点个数(根结点为第0层) 二,二叉树的构建 定义一个BinaryTree类来表示二叉树,二叉树BinaryTree 又是由 ...

  3. c语言实现求二叉树叶子结点个数

    通过递归求解二叉树叶子结点个数,关键在于递归结束条件的设置. main.c #include<stdio.h>//定义结点类型 typedef struct BINARYNODE {cha ...

  4. 完全二叉树的结点个数

    递归法 1.确定递归函数的参数和返回值:参数就是传⼊树的根节点,返回就返回以该节点为根节点⼆叉树的节点数量,所以返回值为int类型. int countNodes(TreeNoed* root) 2. ...

  5. leetcode13——步长k的差值小于t的元素组,包含1的正方形面积,完全二叉树的结点个数,矩形重叠面积,汇总区间

    题目一: leetcode220 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值 ...

  6. 已知树的总结点,求完全二叉树叶子结点的两种方法实现

    方法一:简便做法 一棵树含有n个结点,则最后一个结点的编号必为n,它的父结点则为n/2,且为上一层最右边的一个结点.所以根结点的个数就为:n-n/2. 此题中,n = 767,n-n/2 = 767 ...

  7. 【数据结构】(二叉树)递归求解双分支结点个数

    算法思想: 求二叉树双分支结点个数就是当一个结点左右孩子非空 时该结点为双分支结点 //二叉树结构体定义 typedef struct BiTree{char data;BiTree *lchild; ...

  8. 二叉树的进阶操作---(求二叉树中所有结点个数,求叶子结点个数,求第k层结点个数;在二叉树中查找某一结点;层序遍历;判断是否为完全二叉树)

    typedef struct TreeNode {struct TreeNode *left;struct TreeNode *right;char val; }TreeNode;typedef st ...

  9. 求完全二叉树结点个数(leetcode 222)

    力扣 目录 思路 1.递归(看作普通二叉树 求结点个数) 2.利用完全二叉树的特性(位运算+二分法) 思路 1.递归(看作普通二叉树 求结点个数) 递归出口: (1)根节点为空,返回0 (2)根节点的 ...

最新文章

  1. esxi所连交换机划vlan导致vm不能通讯
  2. HttpClient和HttpURLConnection的使用和区别(上)
  3. JavaScript:学习笔记(9)——Promise对象
  4. oracle insert 新增语句
  5. cvs有机添加剂检测_美国ECI CVS 电镀添加剂分析仪QL-10EX
  6. 面试题系列(10):一个大型电商网有大量的图片,加载很慢,你有哪些方法优化这些图片的加载?...
  7. 理解Java集合框架里面的的transient关键字
  8. C#生成CHM文件(应用篇)之代码库编辑器(1)
  9. 3.8 以符号常量/字面常量取代魔法数
  10. OA选型案例:建筑行业选型华天OA系统
  11. Linux系统常用命令(一)
  12. loaded question解释
  13. python抓取天气预报_抓取天气预报的代码(Python)
  14. JAVA Excel下载学习
  15. 工程流体力学笔记暂记33 (边界层动量积分方程)
  16. Learning to Filter: Siamese Relation Network for Robust Tracking 论文笔记
  17. java怎么定位error_程序遇到错误定位一些小技巧
  18. 用python输出沙漏_2018-2019寒假作业 其一 打印沙漏
  19. 助你编程能力「突飞猛进」的干货分享
  20. IDEA安装卸载插件

热门文章

  1. u-boot向linux内核传递启动参数
  2. resolv.conf
  3. k1658停运到什么时候_最近网传的春节快递停运时间表,是假的!
  4. java中输出值保留四位小数_Java工程师(3).变量和数据类型
  5. python库快速安装_python的pip快速安装代码
  6. 【转】C,C++宏中#与##的讲解
  7. PowerDesigner怎样才能在修改表的字段Name的时候Code不自动跟着变
  8. java 切换panel会闪烁_【19期】为什么Java线程没有Running状态?
  9. 记录一个JS异常Uncaught NotFoundError
  10. Python3 基础学习笔记 C05【字典】