12 tree
题目一,输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
解题思路一:分别求树的前序遍历,若a包含b的前序遍历则,是子结构,反之不是
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if(root1==null || root2==null)
return false;
StringBuilder sb = new StringBuilder();
StringBuilder sb2 = new StringBuilder();
String str1 = preOrder(root1,sb);
String str2 = preOrder(root2,sb2);
if(str1.contains(str2)){
return true;
}
return false;
}
public String preOrder(TreeNode root,StringBuilder sb){
if(root!=null)
sb.append(root.val+",");
if(root.left!=null){
preOrder(root.left,sb);
}
if(root.right!=null){
preOrder(root.right,sb);
}
return ","+sb.toString();
}
}
解题思路二:
public static boolean HasSubtree(TreeNode tree1,TreeNode tree2){
boolean result = false;
//当Tree1和Tree2都不为零的时候,才进行比较。否则直接返回false
if(tree1 !=null && tree2!=null){
//如果找到了对应Tree2的根节点的点
if(tree1.val == tree2.val){
//以这个根节点为为起点判断是否包含Tree2
result = isTreeHasTree(tree1,tree2);
}
//如果找不到,那么就再去root的左儿子当作起点,去判断时候包含Tree2
if(!result){
result = HasSubtree(tree1.left,tree2);
}
//如果还找不到,那么就再去root的右儿子当作起点,去判断时候包含Tree2
if(!result){
result = HasSubtree(tree1.right,tree2);
}
}
return result;
}
/**
* 判断tree1是否包含tree2
* @param tree1
* @param tree2
* @return
*/
public static boolean isTreeHasTree(TreeNode tree1,TreeNode tree2){
//如果Tree2已经遍历完了都能对应的上,返回true
if(tree2 == null){
return true;
}
//如果Tree2还没有遍历完,Tree1却遍历完了。返回false
if(tree1 == null){
return false;
}
//如果其中有一个点没有对应上,返回false
if(tree1.val !=tree2.val){
return false;
}
//如果根节点对应的上,那么就分别去子节点里面匹配
return isTreeHasTree(tree1.left,tree2.left) && isTreeHasTree(tree1.right,tree2.right);
}
题目二:操作给定的二叉树,将其变换为源二叉树的镜像。
/* 先前序遍历这棵树的每个结点,如果遍历到的结点有子结点,就交换它的两个子节点,当交换完所有的非叶子结点的左右子结点之后,就得到了树的镜像 */public void Mirror(TreeNode root) {
if(root!=null){
TreeNode temp=null;
temp=root.left;
root.left=root.right;
root.right=temp;
if(root.left!=null){
Mirror(root.left);
}
if(root.right!=null){
Mirror(root.right);
}
}
}

浙公网安备 33010602011771号