给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
进阶:
你可以运用递归和迭代两种方法解决这个问题吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/symmetric-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
___________________________________________________________________________________________
思路:
镜像对称,在某个节点root上总左右相等:root.left == root.right,扩展开来就是左右子树的镜像对称。
那么考虑从根节点开始,对左右子树分别进行镜像遍历。
例如,对左子树:根-左-右,那么对右子树则是:根-右-左。
代码如下:
递归实现:
func isSymmetric(root *TreeNode) bool {
if root == nil || (root.Left == nil && root.Right == nil) {
return true
}
rl := root.Left
rr := root.Right
flag := true
Run(rl,rr,&flag)
return flag
}
func Run(l,r *TreeNode,flag *bool) {
if (l == nil && r == nil) || *flag == false {
return
}
if (l == nil && r != nil) || (l != nil && r== nil) {
*flag = false
return
}
if l != nil && r != nil {
if l.Val != r.Val {
*flag = false
}
}
//左右采用镜像遍历
Run(l.Left,r.Right,flag)
Run(l.Right,r.Left,flag)
}
非递归方法,我使用的是非递归前序遍历,用其他遍历方法也可。
func isSymmetric(root *TreeNode) bool {
if root == nil || (root.Left == nil && root.Right == nil) {
return true
}
stackl := make([]*TreeNode,0)
stackr := make([]*TreeNode,0)
l := root.Left
r := root.Right
//前序镜像遍历
for len(stackr)!=0 || len(stackl) != 0 || l != nil || r != nil {
if l == nil && r != nil {
return false
}
if l != nil && r == nil {
return false
}
for l != nil && r != nil {
if l.Val != r.Val {
return false
}
stackl = append(stackl,l)
stackr = append(stackr,r)
l = l.Left
r = r.Right
if l == nil && r != nil {
return false
}
if l != nil && r == nil {
return false
}
}
lTop := stackl[len(stackl)-1]
rTop := stackr[len(stackr)-1]
stackl = stackl[:len(stackl)-1]
stackr = stackr[:len(stackr)-1]
l = lTop.Right
r = rTop.Left
if l == nil && r != nil {
return false
}
if l != nil && r == nil {
return false
}
}
return true
}