• 作者:老汪软件技巧
  • 发表时间:2024-09-27 00:01
  • 浏览量:

题目要求:给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。

2

1. 翻转

以树的根节点为中轴线, 翻转过来(镜像).交换的不仅仅是值, 指针也做了交换, 比如节点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