题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
解题思路
1、首先设置标志位,result = false,如果匹配成功则返回true,剩下的代码就不会执行,如果匹配不成功,返回默认值;
2、使用递归思想,如果相对的根节点相同,则递归调用isSubtree
方法,如果相对根节点不同,则继续分别判断对应左子树和右子树是否相同;
3、注意null条件 ,HasSubTree
中如果两棵树都不为空才进行判断,isSubtree
中如果tree2为空,则说明第二棵树已经遍历完了,即匹配成功。tree1为空分两种情况如果tree1为空且tree2不为空说明匹配不成功;如果tree1为空tree2为空说明匹配。参考代码:
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
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;
}
private boolean isSubtree(TreeNode root1,TreeNode root2){
if(root2 == null) return true;
if(root1 == null) return false;
if(root1.val != root2.val) return false;
return isSubtree(root1.left,root2.left)&&isSubtree(root1.right,root2.right);
}
}
题目描述
操作给定的二叉树,将其变换为源二叉树的镜像。
输入描述:
二叉树的镜像定义:源二叉树
8
/ \
6 10
/ \ / \
5 7 9 11
镜像二叉树
8
/ \
10 6
/ \ / \
11 9 7 5
代码参考
首先判断根节点是否为空,然后判断根节点的左孩子和右孩子是否都不存在,然后交换左右孩子,最后使用递归实现。
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
TreeNode temp = null;
public void Mirror(TreeNode root) {
if(root == null) return;
if(root.left == null && root.right == null) return;
temp = root.left;
root.left = root.right;
root.right = temp;
if(root.left != null) Mirror(root.left);
if(root.right != null) Mirror(root.right);
}
}