和广度优先搜素的思路一样,一定是会遍历所有的节点的,但是因为要输出的是二叉树的镜像,所以在遍历的时候,需要将左右结点做一个交换的处理,这样就可以保证输出的为二叉树的镜像。(每一层都进行左右结点交换处理之后添加进队列当中)
依然是开头先新建一个队列,并且添加根结点进队列。(感觉和广度优先搜索二叉树没有区别,只是多了一步)
import collections
class Solution:
def mirrorTree(self, root: TreeNode) -> TreeNode:
if not root :return root
dq = collections.deque()
dq.append(root)
while dq:
curr = dq.popleft()
temp = curr.left
curr.left = curr.right
curr.right = temp
if curr.left: dq.append(curr.left)
if curr.right: dq.append(curr.right)
return root
该题题意要求检验二叉树是否为对称的二叉树,而对称则必有最左的结点等于最右的结点。
因为要对最左的结点是否等于最右的结点进行判断,正常的广度优先搜索并不适用于该题,因此需要使用到递归。
写递归要优先考虑递归的终止回溯条件,先定义递归函数recur(),根据题可以得知此题递归到最后应该是没有任何结点的,所以当not L and not R为真,就可以确定左右端都到了最底下,进行回溯。
而判断假的条件为如果左右两端有一端为空而另一端不为空,或者左右两边结点的值并不相等,就可以返回假,而因为上面已经判断了左右两端是不是都为空,所以直接not R or not L即可。
进行递归的返回值为左结点的左结点与右结点的右结点与左结点的右结点与右结点的左结点进行和运算。
当所有都为真时则为堆成的二叉树
code:
class Solution:
def isSymmetric(self, root: TreeNode) -> bool:
def recur(L,R):
if not L and not R: return True
if not L or not R or L.val != R.val:return False
return recur(L.left,R.right) and recur(L.right,R.left)
return recur(root.left,root.right) if root else True