力扣 || 101.对称二叉树--Golang
程序员文章站
2024-01-11 17:21:40
...
知识点:树
难度:简单
题目:
给定一个二叉树,检查它是否是镜像对称的。
示例:
方法一:递归
如果一个树的左子树与右子树镜像对称,那么这个树是对称的。
因此,该问题可以转化为:两个树在什么情况下互为镜像?
如果同时满足下面的条件,两个树互为镜像:
1.它们的两个根结点具有相同的值。
2.每个树的右子树都与另一个树的左子树镜像对称。
就像人站在镜子前审视自己那样。镜中的反射与现实中的人具有相同的头部,但反射的右臂对应于人的左臂,反之亦然。
Golang:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func isSymmetricGo(t1 *TreeNode, t2 *TreeNode) bool {
if t1==nil && t2==nil {
return true
} else if t1==nil || t2==nil {
return false
}
return t1.Val == t2.Val && isSymmetricGo(t1.Left, t2.Right) && isSymmetricGo(t1.Right, t2.Left)
}
func isSymmetric(root *TreeNode) bool {
return isSymmetricGo(root, root)
}
执行:
复杂度分析:
时间复杂度:O(n)
空间复杂度:O(n)
方法二:迭代
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func isSymmetric(root *TreeNode) bool { // 迭代方法,bfs
lq := []*TreeNode{} // 从左向右遍历顺序的队列
rq := []*TreeNode{} // 从右向左遍历顺序的队列
lq = append(lq, root) // 加入初始节点
rq = append(rq, root)
for len(lq)!=0 && len(rq)!=0 { // bfs
lcur,rcur := lq[0], rq[0] // 不同遍历顺序的队列,队首出队
lq, rq = lq[1:], rq[1:] // 删除队首元素
if lcur==nil && rcur==nil { // 空节点,不添加节点
continue
} else if lcur!=nil && rcur!=nil && lcur.Val == rcur.Val { // 比较两种遍历顺序的出队节点,如果相同,继续搜索
lq = append(lq, lcur.Left, lcur.Right)
rq = append(rq, rcur.Right, rcur.Left)
} else { // 如果不同,证明不是镜像二叉树
return false
}
}
if len(lq)==0 && len(rq)==0 {
return true
} else {
return false
}
}
执行:
复杂度分析:
时间复杂度:O(n)
空间复杂度:O(n)