27.二叉树的镜像
完成一个函数,输入一个二叉树,该函数输出它的镜像。
其实第一个想到的就是交换左右节点,想的很简单了,但是怎么交换呢?交换一个之后,剩下的怎么办?
其实呢,就是递归:递归就要进行回溯,交换的机制是从下到上进行交换的。那就进行递归,先递归到底层,然后再从底层进行回溯。
ps:感觉说了跟没说一样,说的我自己都不知道在说什么,如果有大佬愿意指点一下或总结一下我这次里先谢谢了!
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = Noneclass Solution:def mirrorTree(self, root: TreeNode) -> TreeNode:if not root:return rootroot.left, root.right = self.mirrorTree(self.right), self.mirrorTree(self.left)return root
28.对称的二叉树
实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
上面刚写了一个二叉树的镜像,这不就简单了吗?判断二叉树和镜像树是否一样不就好了?那就试试。天真!判断两个树一样是用两个等号就可以的吗?要判断节点、结构是否一样的!
所以还得是递归!直接递归也不可行,毕竟还是跟镜像树不一样的。对称二叉树主要判断的是左右节点是否对称。
所以得有一个函数进行判断是否符合条件:
1.左右节点都为空则返回True
2.左节点为空,或右节点为空,或左右节点的值不等,返回False
3.前两个条件都不满足的话说明左右节点的值相等,那么进行下一次递归。这里需要注意的是判断对称,是判断左节点的左节点与右节点的右节点的值是否相等,左节点的右节点与右节点的左节点是否相等。还有一点就是,这里的递归是没有回溯的。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = Noneclass Solution:def isSymmetric(self, root: TreeNode) -> bool:def recur(L, R):if not L and not R:return Trueif not L or not R or L.val != R.val:return Falsereturn recur(L.left, R.right) and recur(L.right, R.left)if root:return recur(root.left, root.right)else:return True