题目:树的子结构
思路
思路很简单,判断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);
}
}