法一:递归、栈
解题思路:
首先,根节点和根结点比较,然后是根结点的左孩子和根结点的右孩子进行比较,根结点的右孩子和根结点的左孩子进行比较。再去递归左孩子和右孩子比较,左孩子的左孩子和右孩子的右孩子比较,左孩子的右孩子和右孩子的左孩子比较。
递归的终止条件是:
1.比较的两个结点都为空
2.比较的两个结点的其中一个结点为空
3.比较的两个结点不相等
//递归
func isSymmetric(root *TreeNode) bool {
return check(root,root)
}
func check(p,q*TreeNode) bool{
if p==nil&&q==nil{
return true
}
if p==nil||q==nil{
return false
}
return p.Val==q.Val&&check(p.Right,q.Left)&&check(p.Left,q.Right)
}
时间复杂度:O(n). 需要遍历n个结点
空间复杂度:O(n). 空间复杂度是递归的深度,也就是跟树高度有关,最坏情况下树变成一个链表结构,高度是nn。
法二:迭代、队列
解题思路: