平衡二叉樹
對於任意一個節點,左子樹和右子樹的高度差不超過1.滿二叉樹一定是平衡二叉樹.
解題思路:
在樹類問題上,遞歸函數使用起來很方便.它可以讓我們從一個節點上經過三次.利用這個特性可以解決大多數的問題.
我們可以先收集左樹信息,再收集右數信息然後返回到當前節點判斷該節點是否滿足要求.
在本題中,我們需要收集的信息是:左樹是否平衡,右樹是否平衡以及左樹和右樹的高度.
1-可能性分析: 判斷一棵樹是否爲平衡樹也就是判斷任意子樹是不是平衡術.
假設我們來到了節點X,判斷X是否爲平衡樹需要如下信息
a-X的左子樹是不是平衡樹
b-X的右子樹是不是平衡樹
c-如果都平衡,左子樹和右子樹的高度是多少
2-設計遞歸返回結構
遞歸返回結構應該包含我們需要的 高度和是否平衡.
class Res{
int height;
boolean isB;
Res(int height,boolean isB){
this.height = height;
this.isB = isB;
}
}
3-設計遞歸過程
public static Res process(Node head){
//1-基本的邊界值判斷
if(head == null){
return (0,true);
}
//3-左節點返回的值
Res leftRes = process(head.left);
//4-根據左節點的返回值做出判斷
if(!leftRes.isB){
return new Res(0,false);
}
//5-右節點的返回值
Res rightRes = process(head.right)
//6-同樣做出判斷
if(!rightRes.isB){
return new Res(0,false);
}
if(Math.abs(leftRes.height - rightRes.height) > 1){
return new Res(0,false);
}
//2-當前節點符合條件,應該返回什麼
return new Res(Math.max(leftRes.height,rightRes.height) + 1, true);
}