1.首先我們了解什么是完全二叉樹
完全二叉樹: 葉子節(jié)點只會出現(xiàn)最后2層腹尖,且最后1層的葉子節(jié)點都靠左對齊陋桂。
2.這里我們采用遞歸套路來解決
遞歸套路
(1)分析問題的各種可能性
(2)根據(jù)可能性去確定要去收集左右子樹的哪些信息柄沮,寫出信息體
(3)根據(jù)收集來左右子樹的信息得到自己的這些信息
(4)返回信息體類型對象
3.解題步驟
(1)完全二叉樹有以下幾種情況
一是左子樹為完全二叉樹,右子樹為滿二叉樹内狗,且左子樹的高度=右子樹高度+1
二是左子樹為滿二叉樹啦膜,右子樹為滿二叉樹,且且左子樹的高度=右子樹高度+1
三是左子樹為滿二叉樹胃榕,右子樹為完全二叉樹盛险,且左子樹高度=右子樹高度
四是左子樹為滿二叉樹惧眠,右子樹為滿二叉樹腹忽,且左子樹高度等于右子樹高度
(2)通過列舉可能出現(xiàn)的情況
我們可以確定一棵二叉樹是不是完全二叉樹只與左右子樹是否為滿二叉樹、是否為完全二叉樹以及左右子樹的高度有關(guān)届宠,因此我們可以將信息體Info定義為
class Info{boolean isFull,boolean isCBT,int height}
(3)收集左右子樹信息體數(shù)據(jù)赐写,根據(jù)收集來的信息得到自己的信息
①首先要確定節(jié)點為空的情況鸟蜡,這里比較簡單,return new Info(true,true,0)即可,即我們認為空樹是滿二叉樹挺邀,是完全二叉樹揉忘,高度為0
②遞歸調(diào)用自身跳座,收集左右子樹信息,返回值類型為信息體類型Info類型
boolean isFull=leftInfo.isFull&&rightInfo.isFull&&leftInfo.height==rightInfo.height
(注意不要忘記左右子樹高度要一樣)
是否是完全二叉樹呢泣矛?我們首先假設(shè)不是疲眷,boolean isCBT=false
然后根據(jù)收來的信息以此判斷第一步的各類情況,滿足任一情況您朽,則isCBT=true狂丝,都不滿足則依舊為false
height=Math.max(leftInfo.height,rightInfo.height)+1
(4)返回信息體類型對象
return Info(isFull,isCBT,height)
有時間追更非套路解法,目前還沒學