乱序版 ● 剑指offer每日算法题打卡题解—— 搜索与回溯算法 (题号26,27, 28)

Posted 寂静花开

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了乱序版 ● 剑指offer每日算法题打卡题解—— 搜索与回溯算法 (题号26,27, 28)相关的知识,希望对你有一定的参考价值。

打卡day5

第一题:剑指 Offer 26. 树的子结构

输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。

例如:
给定的树 A:

    3
   / \\
  4   5
 / \\
1   2

给定的树 B:

   4 
  /
 1

返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。

示例 1:

输入:A = [1,2,3], B = [3,1]
输出:false

示例 2:

输入:A = [3,4,5,1,2], B = [4,1]
输出:true

限制:
0 <= 节点个数 <= 10000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof

解题思路:
若树 B 是树 A 的子结构,则数 B 的根节点可能为树 A 的任意一个节点。所以判断树 B 是否是树 A 的子结构时,需要先遍历树 nA为根节点的子树 是否包含树 B。

java代码:

class Solution {
	//遍历树A
    public boolean isSubStructure(TreeNode A, TreeNode B) {
    //当A为空或B为空时,直接返回false
    //满足下面三种情况任意一情况,就说明B是A的子结构
        return (A != null && B != null) && (recur(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B));
    }
    boolean recur(TreeNode A, TreeNode B) {
        if(B == null) return true;//当节点B为空时,说明树B已经匹配完成,返回true
        if(A == null || A.val != B.val) return false;//节点A为空时,证明匹配失败,返回false
        return recur(A.left, B.left) && recur(A.right, B.right);
    }
}

第二题:剑指 Offer 27. 二叉树的镜像

请完成一个函数,输入一个二叉树,该函数输出它的镜像。

例如输入:

     4
   /   \\
  2     7
 / \\   / \\
1   3 6   9

镜像输出:

 4
   /   \\
  7     2
 / \\   / \\
9   6 3   1

示例 1:

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

限制:

0 <= 节点个数 <= 1000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-cha-shu-de-jing-xiang-lcof

解题思路:

二叉树镜像定义: 对于二叉树中任意节点 root ,设其左 / 右子节点分别为 left,right ;则在二叉树的镜像中的对应 root 节点,其左 / 右子节点分别为 right,left 。

可以利用栈(或队列)遍历树的所有节点 nodenode ,并交换每个 nodenode 的左 / 右子节点。

java代码:

class Solution {
    public TreeNode mirrorTree(TreeNode root) {
        if(root == null) return null;//当root为空时,返回null     
        Stack<TreeNode> stack = new Stack<>() {{ add(root); }};//初始化个栈,并加入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;
    }
}


第三题:剑指 Offer 28. 对称的二叉树

请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。

例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

    1
   / \\
  2   2
 / \\ / \\
3  4 4  3

但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

  1
 / \\
2   2
 \\   \\
  3    3

示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true

示例 2:
输入:root = [1,2,2,null,3,null,3]
输出:false

限制:

0 <= 节点个数 <= 1000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/dui-cheng-de-er-cha-shu-lcof

解题思路:

对称二叉树定义: 对于树中 任意两个对称节点 L 和 R,一定有:
L.val = R.val :即此两对称节点值相等。
L.left.val = R.right.val:即 L的 左子节点 和 R的 右子节点 对称;
L.right.val = R.left.val:即 L 的 右子节点 和 R 的 左子节点 对称。

根据节点是否对称,来判断二叉树是否对称

java代码:

class Solution {
    public boolean isSymmetric(TreeNode root) {
    //为空返回true,不为空返回recur函数操作结果
        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);
    }
}


以上是关于乱序版 ● 剑指offer每日算法题打卡题解—— 搜索与回溯算法 (题号26,27, 28)的主要内容,如果未能解决你的问题,请参考以下文章

乱序版 ● 剑指offer每日算法题打卡题解—— 查找算法 (题号3,4,11,53)

乱序版 ● 剑指offer每日算法题打卡题解——分治算法(题号17,14)

乱序版 ● 剑指offer每日算法题打卡题解——数学 (题号39,66)

乱序版 ● 剑指offer每日算法题打卡题解——动态规划(题号19,49,60)

乱序版 ● 剑指offer每日算法题打卡题解——动态规划 (题号10,63)

乱序版 ● 剑指offer每日算法题打卡题解——栈与队列(题号59)