乱序版 ● 剑指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)