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
二、思路分析
- 如果root为空,返回true
- 编写递归函数,递归中止条件为,左右节点均为空,则说明对称,返回true,其中一个节点为空,或者左值不等于右值,则说明不对称返回false。
- 递归则调用该函数,传参为(l.Left,r.Right),(l.Right,r.Left)如果都为true则说明对称
- 时间复杂度:遍历了这棵树,渐进时间复杂度为 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 个节点。