春招打卡|对称二叉树

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

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

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

二、思路分析

  1. 如果root为空,返回true
  2. 编写递归函数,递归中止条件为,左右节点均为空,则说明对称,返回true,其中一个节点为空,或者左值不等于右值,则说明不对称返回false。
  3. 递归则调用该函数,传参为(l.Left,r.Right),(l.Right,r.Left)如果都为true则说明对称
  4. 时间复杂度:遍历了这棵树,渐进时间复杂度为 O(n)。空间复杂度:空间复杂度和递归使用的栈空间有关,递归层数不超过 n,故渐进空间复杂度为 O(n)。

三、AC 代码

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func isSymmetric(root *TreeNode) bool {
    if root == nil {
        return true
    }
    return recur(root.Left,root.Right)
}
func recur(l *TreeNode,r *TreeNode) bool {
    if l == nil && r == nil  {
        return true
    }
    if l == nil || r==nil || l.Val != r.Val {
        return false
    }
    return recur(l.Left,r.Right) && recur(l.Right,r.Left)
}
复制代码

四、总结

从上到下递归,判断每对节点是否对称,判断树是否为对称二叉树。假设树上一共 nn 个节点。

Guess you like

Origin juejin.im/post/7076047758037090317