題目:樹的子結構
思路
思路很簡單,判斷B是不是A的子樹,利用遞歸一個一個比較過來就行。先從跟節點開始,如果根節點不匹配就拿A的左子樹節點和A的右子樹節點與B進行一一匹配,以此類推。按上述思路需要寫個匹配函數。
class Solution {
public boolean isSubStructure(TreeNode A, TreeNode B) {
if(A==null||B==null) return false;
return recur(A,B)||isSubStructure(A.left,B)||isSubStructure(A.right,B);
}
//匹配函數
public boolean recur(TreeNode A,TreeNode B){
//照例起手邊界條件
//爲什麼B==null,就返回true?因爲B==null,說明B的節點都已經驗證完畢,且沒有出現false,所以B就是A的子樹。
//A==null說明B還沒有一一匹配完,A就已經越過葉子節點,那麼B不是A的子樹。
if(B==null) return true;
if(A==null||A.val!=B.val) return false;
return recur(A.left,B.left)&&recur(A.right,B.right);
}
}
題目:二叉搜索樹的後序遍歷序列
思路
思路也很簡單
首先確定後序遍歷的順序:左子樹——右子樹——根節點;
再確定二叉搜索樹的性質:節點的左子樹的值都比它小,右子樹的值都比它大;
遍歷是遍歷左右子樹的區間,那麼找到左右子樹的區間是關鍵。
1.區間起始下表設爲i,最後一位肯定是根節點,假設下標爲j;
2.定義一個指針遍歷數組,直到遇到比根節點大的數,此時記住下標爲m,
那麼左子樹區間就是[i,m-1],右子樹區間[m,j];依次類推。
3.邊界條件:i<j,就返回true;如果遍歷完後,指針p!=j就返回false。
class Solution {
public boolean verifyPostorder(int[] postorder) {
return recur(postorder,0,postorder.length-1);
}
public boolean recur(int[] postorder,int i,int j){
//終止條件
if(i>=j) return true;
int p=i;
while(postorder[p]<postorder[j]) p++;
int m=p;
while(postorder[p]>postorder[j]) p++;
return j==p&&recur(postorder,i,m-1)&&recur(postorder,m,j-1);
}
}