美文网首页
剑指 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