树的子结构
解题思路
1.判断root1和root2的根结点是否相同,相同比较root1和root2的左右子树是否相同
2.root1与root2的根结点不匹配,递归判断root1的左右子树判断
代码
/**
* 剑指offer一刷:树的子结构
*
* @author User
* @create 2019-05-18-19:54
*/
public class jzo17 {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
boolean result=false;
if(root1!=null&&root2!=null){
if(root1.val==root2.val){
result=isSubTree(root1,root2);
}
if (!result){
result=isSubTree(root1.left,root2);
}
if (!result){
result=isSubTree(root1.right,root2);
}
}
return result;
}
public boolean isSubTree(TreeNode root1,TreeNode root2){
if (root1==null&&root2!=null){
return false;
}
if(root2==null){
return true;
}
if(root1.val!=root2.val){
return false;
}
return isSubTree(root1.left,root2.left)&&isSubTree(root1.right,root2.right);
}
}
二叉树的镜像
操作给定的二叉树,将其变换为源二叉树的镜像。
解题思路
至下而上交换左右子节点,完成root的左子树的镜像,右子树的镜像,最后交换root的左右子树完成二叉树的镜像
代码
/**
* 剑指offer一刷:二叉树的镜像
*
* @author User
* @create 2019-05-18-19:55
*/
public class jzo18 {
// public void Mirror(TreeNode root) {
// if(root==null){
return;
}
if(root.left==null&&root.right==null){
return;
}
//非子节点交换
TreeNode temp=root.left;
root.left=root.right;
root.right=temp;
if(root.left!=null){
Mirror(root.left);
}
if(root.right!=null){
Mirror(root.right);
}
// =============================================//
// }
/**
* 至下而上交换左右子树,最好交换root.left和root.right完成交换
*/
public void Mirror(TreeNode root) {
reverseTree(root);
}
public void reverseTree(TreeNode root){
if(root==null){
return;
}
swap(root);
reverseTree(root.left);
reverseTree(root.right);
}
public void swap(TreeNode root){
TreeNode temp=root.left;
root.left=root.right;
root.right=temp;
}
}