Leetcode226翻转二叉树
给你一棵二叉树的根节点 root
,翻转这棵二叉树,并返回其根节点。
思路:
这道题主要是遍历顺序,到底是用前中后的哪种顺序呢?
答案是:前序和后序
首先我们要对左子树和右子树做一个整体反转,先反转左右孩子,然后反转整个左右子树
所以我们处理左右孩子的逻辑要在前面,后序遍历的逻辑是左右根,符合题意,前序遍历也可以,因为先反转根节点,然后再反转左右字数。
为什么不用中续遍历呢?
因为中序遍历是左根右,也就是先处理左子树,然后又处理根节点,再到右子树,但是再右子树时候我们发现现在的这个右子树就是我们之前处理过的左子树,相当于我们并没有对原来的右子树做任何处理,就直接给反转过去了。
递归三部曲:
1.确定要传入的参数,这里我们就传root就可以了
2.确定终止条件,判断如果当前节点为空我们就停止了
3,确定单层递归的逻辑,由于我们采用后序遍历
所以先处理左右在处理根节点
class Solution:
def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
def inver_Tree(root):
if not root:
return None
root.left,root.right = root.right,root.left
inver_Tree(root.left)
inver_Tree(root.right)
inver_Tree(root)
return root
Leetcode101对称二叉树
题目思路:其实这道题的核心在于:
首先想清楚,判断对称二叉树要比较的是哪两个节点,要比较的可不是左右节点!
对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了其实我们要比较的是两个树(这两个树是根节点的左右子树),所以在递归遍历的过程中,也是要同时遍历两棵树。
也就是说如果能通过左子树的反转得到右子树,那这个二叉树就对称的
也就是
左子树的左孩子==右子树的右孩子
左子树的右孩子==右子树的左孩子
这就是满足题意得条件
比较的是两个子树的里侧和外侧的元素是否相等。如图所示:
(来自代码随想录)
代码:
class Solution:
def isSymmetric(self, root: Optional[TreeNode]) -> bool:
if not root:
return False
return self.compare(root.left,root.right)
def compare(self,left,right):
if left==None and right==None:
return True
elif left!=None and right==None:
return False
elif left==None and right!=None:
return False
elif left.val!=right.val:
return False
outside = self.compare(left.left,right.right)
inside = self.compare(left.right,right.left)
isSame = outside and inside #左子树:中、 右子树:中 (逻辑处理)
return isSame
最后这里有一个小坑点,本人亲踩。
不能直接return isinside==outside.
如果是FALSE==FALSE那么返回的结果也是TRUE。所以这里要加一个逻辑判断~!