JZ58 对称的二叉树
对称的二叉树
请实现一个函数,用来判断一棵二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
方法1:递归版本
func helper(Left, Right *TreeNode) bool { if Left == nil && Right== nil { return true } else if Left == nil || Right == nil { return false } else if Left.Val != Right.Val { return false } return helper(Left.Left,Right.Right) && helper(Left.Right,Right.Left) } func isSymmetrical( pRoot *TreeNode ) bool { if pRoot == nil { return true } return helper(pRoot.Left, pRoot.Right) }
方法2:
循环版本:
使用一个栈,分别将左子树的左节点和右子树的右节点压入stack,然后将左子树的右节点和右子树的左节点压入栈。每次循环弹出两个元素看是否相等,是否为空的上面的判断。一定要注意两个都为空的时候要continue,后面压栈的时候需要访问左右节点。不continue的会访问空节点。
func isSymmetrical(pRoot *TreeNode) bool { if pRoot == nil { return true } var s []*TreeNode p, q := pRoot.Left, pRoot.Right s = append(s, p, q) for len(s) != 0 { p = s[len(s)-1] s = s[:len(s)-1] q = s[len(s)-1] s = s[:len(s)-1] if p == nil && q == nil { continue } if p == nil || q == nil { return false } if p.Val != q.Val { return false } s = append(s, p.Left, q.Right) s = append(s, p.Right, q.Left) } return true }