剑指Offer第七天
题1:树的子结构
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
看的懂,但是还是不理解。。(如果我碰到这种题,我会写的出来吗。。)
参考题解写的。。
https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof/solution/mian-shi-ti-26-shu-de-zi-jie-gou-xian-xu-bian-li-p/
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSubStructure(TreeNode A, TreeNode B) {
if(A == null || B == null){
return false;
}
//这种情况就是有可能A==B
if(A.val == B.val && recur(A.left, B.left) && recur(A.right, B.right)){
return true;
}
//如果不是A完全等于B,就从A的左右节点扩充寻找
return isSubStructure(A.left,B) || isSubStructure(A.right, B);
}
public boolean recur(TreeNode A, TreeNode B){
//当B遍历到没数据的时候,如果还没有返回false,那就是true了
if(B == null){
return true;
}
if(A == null){
return false;
}
if(A.val == B.val){
//当遇到根节点的值相等,才触发入口向下走
//如果是子节点,就会一直相等,直到B==null的时候,这时候就会如上面,返回true
return recur(A.left, B.left) && recur(A.right,B.right);
}else{
//如果不是从入口开始一直相等,就是失败了。。
return false;
}
}
}
题2:二叉树的镜像
请完成一个函数,输入一个二叉树,该函数输出它的镜像。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode mirrorTree(TreeNode root) {
//就是左右节点调换?用栈?
if(root == null){
return root;
}
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode node = stack.pop();
if(node.left != null){
stack.push(node.left);
}
if(node.right != null){
stack.push(node.right);
}
TreeNode temp = node.left;
node.left = node.right;
node.right = temp;
}
return root;
}
}
题3:对称的二叉树
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null){
return true;
}
return helper(root.left, root.right);
}
public boolean helper(TreeNode left, TreeNode right){
if(left == null && right == null){
return true;
}
if(left == null || right == null){
return false;
}
return left.val == right.val && helper(left.left, right.right) && helper(left.right, right.left);
}
}
好烦啊,对递归一点感觉都没有。。。。