【LeetCode】相同的树、 翻转二叉树 、对称二叉树

100.相同的树

两棵树相同的条件就是根节点及他们的左右子树的值val相同,结构相同,就是一模一样,那这道题最终还是要同时遍历两个树的,并且还得遍历完,那如果我们在遍历的过程中,通过设置一些不满足相同的树的条件,那么只要遍历到不同的,就返回false。并且在每一次左右子树递归完成后就进行判断,(各自判断一次),如果不满足就不往下遍历了,否则,一直遍历。

不同的条件:左根为空并且右根不为空,或者,左根不为空并且右根为空,或者,左右根的值val不同。

【LeetCode】相同的树、 翻转二叉树 、对称二叉树_第1张图片

 算法代码

class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if(p==null&&q==null) return true;  //说明本层遍历到末尾了,且本层是相同的树
        if(p==null&&q!=null || p!=null&&q==null || p.val != q.val) return false; //树不相同的全部条件
   
        boolean left = isSameTree(p.left,q.left);
        if(left == false) return false;  //返回fslse说明不相同,结束遍历,返回true则得继续遍历
        boolean right = isSameTree(p.right,q.right);
        if(right == false) return false;  //返回fslse说明不相同,结束遍历,返回true则得继续遍历
        return true;  //能执行到这里说明本层根节点及子树是相同的,再往上一层递归的归
    }
}

【LeetCode】相同的树、 翻转二叉树 、对称二叉树_第2张图片

 

226.翻转二叉树

即从根节点开始,翻转根节点的左右子树,再以左孩子节点为当前根节点,翻转左孩子的左右子树,再以右孩子节点为当前根节点,翻转右孩子的左右子树.......依次往下递归,即就把每一个节点当成当前的根节点,再翻转它的左右子树,这样递归就形成了。(可以写一个交换函数)

【LeetCode】相同的树、 翻转二叉树 、对称二叉树_第3张图片

 算法代码

class Solution {
    /*
    public TreeNode invertTree(TreeNode root) {
        if(root == null) return root; 
        exchange(root);  //交换函数
        invertTree(root.left);
        invertTree(root.right);
        return root;
    }
    public static void exchange(TreeNode root){ 
        TreeNode tmp = root.left;
        root.left = root.right;
        root.right = tmp;
    }
    */

    public TreeNode invertTree(TreeNode root) {
        if(root == null) return root; 
        TreeNode tmp = root.left; //临时节点,用来交换
        root.left = root.right;
        root.right = tmp;
        invertTree(root.left); //对根的左子树进行交换
        invertTree(root.right); //对根的右子树进行交换
        return root;
    }

}

【LeetCode】相同的树、 翻转二叉树 、对称二叉树_第4张图片

 

572.另一棵树的子树

另一棵树的子树,实则还得判断root的的子树与subRoot相不相同,即可引用上面两棵相同的树的代码成为一个函数,判断相不相同,在遍历的时候,root树需要不断的往下遍历,而subRoot树只在root树与其(指SubRoot树)根节点相同的时候才再往下遍历。即函数传递节点的时候总是传递subRoot树的根节点。这点很重要。

【LeetCode】相同的树、 翻转二叉树 、对称二叉树_第5张图片

 算法代码

class Solution {
    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        //第一种
        /*
        if(isSameTree(root,subRoot)==true)  return true; //  归的条件
        if(root==null ) return false;                    //  归的条件
        return isSubtree(root.left,subRoot) || isSubtree(root.right,subRoot);  //不断的递
        */
        
        //第二种
        /*
        if(root==null ) return false;
        if(isSameTree(root,subRoot)==true)  return true;
        if(isSubtree(root.left,subRoot)==true)  return true;
        if(isSubtree(root.right,subRoot)==true)  return true;
        return false;
        */
    }

    public static boolean isSameTree(TreeNode p, TreeNode q) {  //借用相同的树的代码
        if(p==null&&q==null) return true;
        if(p==null&&q!=null || p!=null&&q==null || p.val != q.val) return false;
   
        boolean left = isSameTree(p.left,q.left);
        if(left == false) return false;
        boolean right = isSameTree(p.right,q.right);
        if(right == false) return false;
        return true;
    }
}

【LeetCode】相同的树、 翻转二叉树 、对称二叉树_第6张图片

 

你可能感兴趣的:(LeetCode,leetcode,数据结构,算法,java)