美文网首页
剑指 Offer 28. 对称的二叉树、剑指 Offer 26.

剑指 Offer 28. 对称的二叉树、剑指 Offer 26.

作者: Abeants | 来源:发表于2021-11-21 22:50 被阅读0次

剑指 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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/dui-cheng-de-er-cha-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路及方法

用两个指针记录根节点子树的方向,左右子树指针移动的时候是朝着相反的方向移动。

/**
 * 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 isSame(root.left, root.right);
    }

    public boolean isSame(TreeNode p, TreeNode q) {
        if (p == null && q == null) return true;
        if ((p != null && q == null) || (p == null && q != null)) return false;

        return p.val == q.val && isSame(p.left, q.right) && isSame(p.right, q.left);
    }
}

结果如下:

剑指 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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路及方法

很简单的思想,双重 DFS,每次遇到 A.val == B.val 就把现在的 A 结点当作根节点去对边,看看是否包含B。

/**
 * 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;

        return contains(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B);
    }

    public boolean contains(TreeNode p, TreeNode q) {
        if (q == null) return true;
        if (p == null) return false;

        return p.val == q.val && contains(p.left, q.left) && contains(p.right, q.right);
    }
}

结果如下:

相关文章

网友评论

      本文标题:剑指 Offer 28. 对称的二叉树、剑指 Offer 26.

      本文链接:https://www.haomeiwen.com/subject/aktvtrtx.html