1.首先我们了解什么是完全二叉树
完全二叉树: 叶子节点只会出现最后2层,且最后1层的叶子节点都靠左对齐。
2.这里我们采用递归套路来解决
递归套路
(1)分析问题的各种可能性
(2)根据可能性去确定要去收集左右子树的哪些信息,写出信息体
(3)根据收集来左右子树的信息得到自己的这些信息
(4)返回信息体类型对象
3.解题步骤
(1)完全二叉树有以下几种情况
一是左子树为完全二叉树,右子树为满二叉树,且左子树的高度=右子树高度+1
二是左子树为满二叉树,右子树为满二叉树,且且左子树的高度=右子树高度+1
三是左子树为满二叉树,右子树为完全二叉树,且左子树高度=右子树高度
四是左子树为满二叉树,右子树为满二叉树,且左子树高度等于右子树高度
(2)通过列举可能出现的情况
我们可以确定一棵二叉树是不是完全二叉树只与左右子树是否为满二叉树、是否为完全二叉树以及左右子树的高度有关,因此我们可以将信息体Info定义为
class Info{boolean isFull,boolean isCBT,int height}
(3)收集左右子树信息体数据,根据收集来的信息得到自己的信息
①首先要确定节点为空的情况,这里比较简单,return new Info(true,true,0)即可,即我们认为空树是满二叉树,是完全二叉树,高度为0
②递归调用自身,收集左右子树信息,返回值类型为信息体类型Info类型
boolean isFull=leftInfo.isFull&&rightInfo.isFull&&leftInfo.height==rightInfo.height
(注意不要忘记左右子树高度要一样)
是否是完全二叉树呢?我们首先假设不是,boolean isCBT=false
然后根据收来的信息以此判断第一步的各类情况,满足任一情况,则isCBT=true,都不满足则依旧为false
height=Math.max(leftInfo.height,rightInfo.height)+1
(4)返回信息体类型对象
return Info(isFull,isCBT,height)
有时间追更非套路解法,目前还没学