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