剑指offer26 树的子结构:
//先找到A中和B根结点一样的结点
public boolean isSubStructure(TreeNode A, TreeNode B){
if(A==null||B==null) return false;
return Solve(A,B)||isSubStructure(A.left,B)||isSubStructure(A.right,B);
}
//找到后开始遍历判断是否一样
public boolean Solve(TreeNode A,TreeNode B){
if(B==null) return true;
if(A==null||A.val!=B.val) return false;
return Solve(A.left,B.left)&&Solve(A.right,B.right);
}
剑指offer28 对称的二叉树
方法一:dfs
public boolean isSymmetric(TreeNode root){
return root==null?true:Solve(root.left,root.right);
}
public boolean Solve(TreeNode A,TreeNode B){
if(A==null&&B==null) return true;
if(A==null||B==null||A.val!=B.val) return false;
return Solve(A.left,B.right)&&Solve(A.right,B.left);
}
方法二:BFS
思路:if(leftNode==null&&rightNode==null)的条件时 不能和递归一样直接返回true,因为递归时从下到上遍历的,当前为true不代表整体为true,还会接着遍历。BFS是从上往下,如果在过程过直接return true,程序就结束了,剩下的结点还没有遍历到。
public boolean isSymmetric(TreeNode root){
if(root==null||(root.left==null&&root.right==null)) return true;
Queue<TreeNode> queue=new LinkedList<>();
queue.add(root.left);
queue.add(root.right);
while(!queue.isEmpty()){
TreeNode leftNode=queue.poll();
TreeNode rightNode=queue.poll();
if(leftNode==null&&rightNode==null) continue;
if(leftNode==null||rightNode==null) return false;
if(leftNode.val!=rightNode.val) return false;
queue.add(leftNode.left);
queue.add(rightNode.right);
queue.add(leftNode.right);
queue.add(rightNode.left);
}
return true;
}