- 作者:老汪软件技巧
- 发表时间:2024-09-27 00:01
- 浏览量:
题目要求:给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。
以树的根节点为中轴线, 翻转过来(镜像).交换的不仅仅是值, 指针也做了交换, 比如节点2的左右孩子1和3, 也是从左边翻转到了右边
2. 递归逻辑
就是把根的左子树和根的右子树做交换, 然后再把左子树部分的左子树和右子树做交换, 就能得到结果
递归三部曲:
TreeNode* invertTree(root){}
遇到空节点, 就终止遍历 if (root == null) return root ;
中 交换左右孩子root.left, root.right = root.right, root.left
左 invertTree(root.left)
右 invertTree(root.right)
3. 前序遍历
中左右 把处理中的逻辑放在最前面
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
if root is None: return root
root.left, root.right = root.right, root.left # 处理根的逻辑
self.invertTree(root.left) # 处理左子树
self.invertTree(root.right) # 处理右子树
return root
4. 后序遍历
左右中 把处理中的逻辑放在最后面
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
if root is None: return root
self.invertTree(root.left) # 处理左子树
self.invertTree(root.right) # 处理右子树
root.left, root.right = root.right, root.left # 处理中的逻辑
return root
5. 中序遍历
左中右
先处理左子树,一路向左,遍历到最左边,然后遇到空的返回到上级,然后处理中, 交换左右孩子, 然后遍历右子树
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
if root is None: return root
self.invertTree(root.left)
root.left, root.right = root.right, root.left
self.invertTree(root.left) # 注意这里!! 还是处理左子树!!! 因为交换完, 右子树就是之前处理过的左子树, 而左子树才是真正要处理的右子树
return root
6.层序遍历
class Solution:
def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
if not root: return root # 空树直接返回
queue = [root] # 用于层遍历的队列, 初始根节点入队
while queue:
size = len(queue) # 获取每一层的节点数
for _ in range(size): # 依次弹出这一层的size个节点
node = queue.pop()
# 交换节点的左右子节点
node.left, node.right = node.right, node.left
# 左右子节点不为空的,加入队列作为下一层处理的节点
if node.left: queue.append(node.left)
if node.right: queue.append(node.right)
return root