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

浙公网安备 33010602011771号