剑指 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
限制:
0 <= 节点个数 <= 1000。
思路:
时间复杂度:O(n),空间复杂度O(1)
用bfs思路做
代码:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func isSymmetric(root *TreeNode) bool {
if root == nil || (root.Left == nil && root.Right == nil){
return true
}
if root.Left == nil || root.Right == nil{
return false
}
var stack1,stack2 []*TreeNode
stack1 = append(stack1, root.Left)
stack2 = append(stack2,root.Right)
for len(stack1)!=0 && len(stack2) != 0{
left := stack1[0]
right := stack2[0]
stack1 = stack1[1:]
stack2 = stack2[1:]
if left.Val != right.Val{
return false
}
if left.Left != nil && right.Right != nil{
stack1 = append(stack1, left.Left)
stack2 = append(stack2, right.Right)
}else if left.Left != nil || right.Right != nil{
return false
}
if left.Right != nil && right.Left != nil{
stack1 = append(stack1, left.Right)
stack2 = append(stack2, right.Left)
}else if left.Right != nil || right.Left != nil{
return false
}
}
if len(stack1)!=0 || len(stack2)!= 0{
return false
}
return true
}
代码效率:
执行用时:0 ms, 在所有 Go 提交中击败了100.00%的用户
内存消耗:2.8 MB, 在所有 Go 提交中击败了39.95%的用户
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!