【剑指 Offer 学习计划】 第七天 搜索与回溯算法

第七天 搜索与回溯算法 (简单)

剑指 Offer 26. 树的子结构

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof

题目

输入两棵二叉树 AB,判断 B是不是 A 的子结构。(约定空树不是任意一个树的子结构)

BA 的子结构, 即 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

解题思路:

DFS。

  • isSubTree():函数判断A存在一部分和B相等
    • B 为空,比较结束,A 存在一部分和 B 相等,true。终止条件
    • B 不为空,A 已经为空或者 A结点的值与 B 结点的值不相等,两者不匹配,false。终止条件
    • 都不是,就继续递归判断,判断 A 和 B 的左子节点是否相等(判断 A 和 B 的右子节点是否相等)
  • 递归遍历A树的每一个节点作为根结点和B树进行比较
    • 不符合就比较左侧的,判断 A 的左子节点和 B 是否相等。
    • 不符合就比较右侧的,判断 A 的右子节点和 B 是否相等。
    • 只要当前结点,左侧,右侧最终匹配成功,都可以判断 B 是 A 的子结构。

代码

/**
 * 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) {
    
    
            return false;
        }
        if(B == null) {
    
    
            return false;
        }
        boolean result = isSubTree(A, B);
        boolean res = isSubStructure(A.left, B) || isSubStructure(A.right, B);
        return result || res;
    }

    public boolean isSubTree(TreeNode A, TreeNode B) {
    
    
        if(B == null) {
    
    
            return true;
        }
        if(A == null || A.val != B.val) {
    
    
            return false;
        }
        return isSubTree(A.left, B.left) && isSubTree(A.right, B.right);
    }
}

在这里插入图片描述

剑指 Offer 27. 二叉树的镜像

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/er-cha-shu-de-jing-xiang-lcof

题目

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

例如输入:

     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

解题思路:

每个结点的左右结点交换位置。

递归,借助临时节点 temp 来交换左右结点。

代码

/**
 * 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 null;
        }
        TreeNode temp = root.left;
        root.left = mirrorTree(root.right);
        root.right = mirrorTree(temp);
        return root;
    }
}

在这里插入图片描述

剑指 Offer 28. 对称的二叉树

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/dui-cheng-de-er-cha-shu-lcof

题目

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

例如,二叉树 [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

解题思路:

从根节点向下逐步递归,判断各左右节点是否对称,从而判断整棵树树是否为对称二叉树。

代码

/**
 * 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;
        }
        // 判断左右结点是否对称
        boolean res = ismirror(root.left, root.right);
        return res;
    }

    public boolean ismirror(TreeNode Tleft, TreeNode Tright) {
    
    
        // 两树为空,肯定对称
        if(Tleft == null && Tright == null) {
    
    
            return true;
        }
        // 其中一棵树为空,或者不对称:两树当前结点值不相等
        if(Tleft == null || Tright == null || Tleft.val != Tright.val) {
    
    
            return false;
        }
        // 两树结点均不为空,递归
        boolean res = ismirror(Tleft.left, Tright.right) && ismirror(Tleft.right, Tright.left);
        return res;
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44695700/article/details/121272401