LeetCode—遞歸總結2

題目:樹的子結構

在這裏插入圖片描述

思路

思路很簡單,判斷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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章