Day07_剑指Offer

最近两天进度不太行,我必须在周五晚上进行复盘,把这几天的题重新做一做,深入的在了解一下算法。尤其是递归的思想。加油第七天,第三十天,就有90道题,质的突破噢噢噢噢~~

package com.sorrymaker.day3107;

/**
 * 树 --->>递归。
 * 检查是否是镜像树
 * @Author nextGame
 * @Date 2021/8/18 22:50
 * @Version 1.0
 */
public class IsSymmetric {


    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode(int x) {
            val = x;
        }
    }


    public boolean isSymmetric(TreeNode root) {
        return root == null ? true : recur(root.left, root.right);
    }
    boolean recur(TreeNode L, TreeNode R) {
        if(L == null && R == null) {
            return true;
        }
        if(L == null || R == null || L.val != R.val) {
            return false;
        }
        return recur(L.left, R.right) && recur(L.right, R.left);
    }
}
package com.sorrymaker.day3107;

import javax.swing.tree.TreeNode;
import java.util.*;

/**
 * 请完成一个函数,输入一个二叉树,该函数输出它的镜像。
 *
 * @Author nextGame
 * @Date 2021/8/18 21:12
 * @Version 1.0
 */
public class MirrorTree {

    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode(int x) {
            val = x;
        }
    }

    public TreeNode mirrorTree(TreeNode root) {
        if(root==null){
            return null;
        }
        Stack<TreeNode> stack = new Stack<>();
        stack.add(root);
        while (!stack.isEmpty()){
            TreeNode node = stack.pop();
            if(node.left!=null){
                stack.add(node.left);
            }
            if(node.right!=null){
                stack.add(node.right);
            }

            TreeNode tmp = node.left;
            node.left = node.right;
            node.right = tmp;
        }
        return root;
    }
}
//       if (root == null) {
//            return null;
//        }
//        /**
//         * 为何需要暂存 rootroot 的左子节点?
//         * 在递归右子节点 root.left = mirrorTree(root.right);
//         *  root.left=mirrorTree(root.right);” 执行完毕后,
//         * root.leftroot.left 的值已经发生改变,此时递归左子节点 mirrorTree(root.left)mirrorTree(root.left) 则会出问题。
//         */
//        TreeNode tmp = root.left;
//        root.left = mirrorTree(root.right);
//        root.right = mirrorTree(tmp);
//        return root;
//    }
package com.sorrymaker.day3107;

/**
 * 输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
 * B是A的子结构, 即 A中有出现和B相同的结构和节点值。
 * @Author nextGame
 * @Date 2021/8/18 20:55
 * @Version 1.0
 */
public class IsSubStructure {
    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode(int x) {
            val = x;
        }
    }


    public boolean isSubStructure(TreeNode A, TreeNode B) {
        //约定空树不是任意一个树的子结构
        if(A==null || B==null) {
            return false;
        }
        if(helper(A,B)) {
            return true;
        }
        //递归判断A树所有子树是否包含B树
        //逻辑或有阻隔作用,当已经判断左边包含了B树了,说明是True, 可以降低损耗。
        return isSubStructure(A.left,B) || isSubStructure(A.right,B);
    }


    //该函数的作用是:判断A树根节点值和B树根节点值是否相等,若不等,返回false,
    // 若相等在递归判断A树的孩子节点和B树的的孩子节点是否对应相等,
    // 如果对应相等了,就说明A的子结构包含B树,返回true。否者就不包含,返回false
    public boolean helper(TreeNode A, TreeNode B) {
        if (B == null) {
            return true;
        }
        //当A.val==B.val时,递归判断A树的子节点和B树的子节点是否对应相等
        if (A != null && A.val == B.val) {
            return helper(A.left, B.left) && helper(A.right, B.right);
        }
        //A树为空或者A节点的值不等于B结点的值,返回false
        return false;
    }
}
posted @ 2021-08-18 23:02  独眼龙  阅读(24)  评论(0)    收藏  举报