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);
            }
             
        }
    }

  

posted @ 2019-10-15 17:15  Apache24  阅读(179)  评论(0)    收藏  举报