二叉树的递归--判断二叉树是否是满二叉树(java实现)

什么是满二叉树

满二叉树(Full Binary Tree)是一种特殊的二叉树,其中每个节点都有两个子节点(左子节点和右子节点),且左子节点的左孩子和右孩子都是该节点。这种树形结构常用于实现优先队列和哈希表等数据结构。

在满二叉树中,每个节点的值域可以被表示为一个递增的满二叉树。例如,对于一个高度为 n 的满二叉树,其每个节点的值域可以表示为一个深度为 log2(n) 的满二叉树。具体来说,对于一个高度为 n 的满二叉树,我们可以将其所有节点的值域表示为一个满二叉树,其中根节点的值域为整个树的值域。这种表示方式可以简化树的遍历算法,从而提高查找、插入和删除操作的效率。

递归解法一

1.先定义一个二叉树

 public class Node{
        int val;
        Node left;
        Node right;

        public Node(int val) {
            this.val = val;
        }
    }

2.解法一思路

通过递归的过程去收集二叉树的高度和节点数信息,满二叉树的节点数等于 2 的k 次方减 1,k代表二叉树的高度,所以收集到这两条信息后,我们就可以判断是否是满二叉树了。

3.定义需要回收的信息

  public class Info1{
        int height;
        int size;

        public Info1(int height, int size) {
            this.height = height;
            this.size = size;
        }
    }

4.递归过程

   public static Info1 process1(Node head){
        if (head == null){
            return new Info1(0,0);
        }
        Info1 left = process1(head.left);
        Info1 right = process1(head.right);
        int height = Math.max(left.height,right.height)+1;
        int size = left.size + right.size + 1;
        return  new Info1(height,size);
    }

5.主方法调用

		/**
		调用递归的过程
		*/
    public static boolean isFull1(Node head){
        if (null == head){
            return true;
        }
        Info1 info1 = process1(head);
        //通过高度和节点数的关系去判断是否是满二叉树。
        return ((1 << info1.height) -1) == info1.size;
    }

递归解法二

1.解题思路

在递归每一个子树时,去判断是不是满二叉树和子树的高度,如果左树和右树都是满二叉树,且两者高度一样,那么整体就是满二叉树

2.定义需要的信息体

   public class Info2{
        boolean isFull;
        int height;

        public Info2(boolean isFull, int height) {
            this.isFull = isFull;
            this.height = height;
        }
    }

3.递归过程

  public static Info2 process2(Node head){
        if (head == null){
            return new Info2(true,0);
        }
        Info2 left = process2(head.left);
        Info2 right = process2(head.right);
        int height = Math.max(left.height,right.height)+1;
        boolean isFull = left.isFull && right.isFull && left.height == right.height;
        return new Info2(isFull,height);
    }

4.主方法调用


    public static boolean isFull2(Node head){
        if (head == null){
            return true;
        }
        Info2 info2 = process2(head);
        return info2.isFull;
    }

二叉树经典递归调用

断二叉树是不是完全二叉树
判断二叉树是不是平衡二叉树
判断是不是搜索二叉树

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值