101 对称二叉树-简单
题目:
给你一个二叉树的根节点 root
, 检查它是否轴对称。
轴对称的意思是节点关于整棵树的根节点 root 对称。
解题思路
解法1:子树互为镜像
如果一个树的左右子树关于根节点对称,那么这个树就是轴对称的。
很直观看就是左右子树互为镜像,那么两个树在什么情况下互为镜像呢?
如果两个树同时满足两个条件,则互为镜像。
1.它们的根节点具有相同的值;
2.一个树的右子树和另一个树的左子树对称;一个树的左子树与另一个树的右子树对称
// date 2023/10/23
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func isSymmetric(root *TreeNode) bool {
var isMirror func(r1, r2 *TreeNode) bool
isMirror = func(r1, r2 *TreeNode) bool {
if r1 == nil && r2 == nil {
return true
}
if r1 == nil || r2 == nil {
return false
}
return r1.Val == r2.Val && isMirror(r1.Left, r2.Right) && isMirror(r1.Right, r2.Left)
}
return isMirror(root, root)
}
解法2:【推荐该算法】
类似层序遍历,将子树的左右结点依次放入队列,通过判断队列中的连续的两个值是否相同来确认是否对称。
// date 2023/10/23
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func isSymmetric(root *TreeNode) bool {
queue := make([]*TreeNode, 0, 16)
queue = append(queue, root, root)
for len(queue) != 0 {
n := len(queue)
for i := 0; i < n; i += 2 {
r1, r2 := queue[i], queue[i+1]
if r1 == nil && r2 == nil {
continue
}
if r1 == nil || r2 == nil {
return false
}
if r1.Val != r2.Val {
return false
}
queue = append(queue, r1.Left, r2.Right, r1.Right, r2.Left)
}
queue = queue[n:]
}
return true
}
最后更新于