二叉树的递归套路——满二叉树

简介: 二叉树的递归套路——满二叉树

给定一棵二叉树的头节点head,返回这颗二叉树是不是满二叉树

特点:如果一颗二叉树的有L层,结点个数是N个的话,必定满足以下这个公式:

(2^L)-1 == N,且只有满二叉树有这个特点

根据二叉树的递归套路,以及满二叉树的特点,我们向每颗子树要的信息就是高度和结点个数。比较简单,就不赘述了。直接看代码叭:

package com.harrison.class08;
public class Code05_IsFull {
  public static class Node {
    public int value;
    public Node left;
    public Node right;
    public Node(int data) {
      this.value = data;
    }
  }
  public static class Info{
    public int height;
    public int nodes;
    public Info(int h,int n) {
      height=h;
      nodes=n;
    }
  }
  public static Info process1(Node head) {
    if(head==null) {
      return new Info(0, 0);
    }
    Info leftInfo=process1(head.left);
    Info righInfo=process1(head.right);
    int height=Math.max(leftInfo.height, righInfo.height)+1;
    int nodes=leftInfo.nodes+righInfo.nodes+1;
    return new Info(height, nodes);
  }
  public static boolean isFull1(Node head) {
    if(head==null) {
      return true;
    }
    Info allInfo=process1(head);
    return (1<<allInfo.height)-1==allInfo.nodes;
  }
  public static int h(Node head) {
    if (head == null) {
      return 0;
    }
    return Math.max(h(head.left), h(head.right)) + 1;
  }
  public static int n(Node head) {
    if (head == null) {
      return 0;
    }
    return n(head.left) + n(head.right) + 1;
  }
  public static boolean isFull2(Node head) {
    if (head == null) {
      return true;
    }
    int height = h(head);
    int nodes = n(head);
    return (1 << height) - 1 == nodes;
  }
  public static Node generateRandomBST(int maxLevel, int maxValue) {
    return generate(1, maxLevel, maxValue);
  }
  public static Node generate(int level, int maxLevel, int maxValue) {
    if (level > maxLevel || Math.random() < 0.5) {
      return null;
    }
    Node head = new Node((int) (Math.random() * maxValue));
    head.left = generate(level + 1, maxLevel, maxValue);
    head.right = generate(level + 1, maxLevel, maxValue);
    return head;
  }
  public static void main(String[] args) {
    int maxLevel = 5;
    int maxValue = 100;
    int testTimes = 1000000;
    for (int i = 0; i < testTimes; i++) {
      Node head = generateRandomBST(maxLevel, maxValue);
      if (isFull1(head) != isFull2(head)) {
        System.out.println("Oops!");
      }
    }
    System.out.println("finish!");
  }
}
相关文章
二叉树的几个递归问题
二叉树的几个递归问题
44 0
|
4月前
|
存储 算法 编译器
技术经验解读:二叉树的遍历:先序中序后序遍历的递归与非递归实现及层序遍历
技术经验解读:二叉树的遍历:先序中序后序遍历的递归与非递归实现及层序遍历
36 0
|
算法
代码随想录 Day11 二叉树 LeetCode T144,145,94 前中后序遍历 (递归解法)
代码随想录 Day11 二叉树 LeetCode T144,145,94 前中后序遍历 (递归解法)
45 0
|
5月前
|
算法
二叉树刷题记(八-二叉树的最大深度-深度遍历)
二叉树刷题记(八-二叉树的最大深度-深度遍历)
|
5月前
|
存储 Serverless 索引
二叉树的前序遍历 、二叉树的最大深度、平衡二叉树、二叉树遍历【LeetCode刷题日志】
二叉树的前序遍历 、二叉树的最大深度、平衡二叉树、二叉树遍历【LeetCode刷题日志】
|
5月前
|
算法
递归算法:二叉树前序、中序、后序遍历解析与递归思想深度剖析
递归算法:二叉树前序、中序、后序遍历解析与递归思想深度剖析
77 0
代码随想录刷题|LeetCode 104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数(上)
代码随想录刷题|LeetCode 104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数
代码随想录刷题|LeetCode 104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数(下)
代码随想录刷题|LeetCode 104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数
|
存储 算法 关系型数据库
重温算法之二叉树的锯齿形层序遍历
关于二叉树的题目其实是我的弱项,虽然二叉树不是很难理解,但是从学校开始接触二叉树开始就对它不是很感冒,所以很多时候都避开它,但是再难咬的骨头也的得啃,二叉树运用在很多程序的底层实现里,比如MySQL的索引实现就是B+树,我们懂得使用索引的同时也得知道,索引为什么这么快,而其快的原因就是底层里B+树得实现。
106 0
重温算法之二叉树的锯齿形层序遍历