描述
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树[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. 也是相反判断
2. 注意判断top的节点left.Right right.Left
实现
递归实现
func isSymmetric(root *TreeNode) bool {
if root == nil{
return true
}
return compare(root.Left, root.Right)
}
func compare(r1 *TreeNode, r2 *TreeNode)bool{
if r1 == nil && r2 == nil{
return true
}else if r1 == nil || r2 == nil{
return false
}else if r1.Val != r2.Val{
return false
}
b1 := compare(r1.Left, r2.Right)
b2 := compare(r1.Right, r1.Left)
return b1 && b2
}
func isSymmetric(root *TreeNode) bool {
stackLeft := make([]*TreeNode, 0)
stackRight := make([]*TreeNode, 0)
curNodeLeft := root
curNodeRight := root
for (curNodeLeft != nil && curNodeRight != nil) || (len(stackLeft) > 0 && len(stackRight) > 0){
for curNodeLeft != nil && curNodeRight != nil{
stackLeft = append(stackLeft, curNodeLeft)
stackRight = append(stackRight, curNodeRight)
curNodeLeft = curNodeLeft.Left
curNodeRight = curNodeRight.Right
if curNodeLeft == nil && curNodeRight == nil{
continue
}else if curNodeLeft == nil || curNodeRight == nil{
return false
}
}
if len(stackLeft) != len(stackRight){
return false
}
topLeft := stackLeft[len(stackLeft) - 1]
topRight := stackRight[len(stackRight) - 1]
if topLeft.Val != topRight.Val{
return false
}
stackLeft = stackLeft[0: len(stackLeft) - 1]
stackRight = stackRight[0: len(stackRight) - 1]
curNodeLeft = topLeft.Right
curNodeRight = topRight.Left
if curNodeLeft == nil && curNodeRight == nil{
continue
}else if curNodeLeft == nil || curNodeRight == nil{
return false
}
}
return true
}