Leetcode|226. 翻转二叉树【笔记】

226. 翻转二叉树【笔记】

  • 链接
  • 前言
  • 题目
  • 关键
  • 本人思路
  • 思路1
  • 相关知识
  • 疑问
  • 参考

链接

https://leetcode-cn.com/problems/invert-binary-tree/

前言

题不难,但是踩坑了

题目

翻转一棵二叉树。

  • 示例
输入: 
     4
   /   \
  2     7
 / \   / \
1   3 6   9                
输出: 
     4
   /   \
  7     2
 / \   / \
9   6 3   1

关键

老递归了

本人思路

  • 二叉树与递归是绝配
# 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: TreeNode) -> TreeNode:
        if not root:
            return root
        # root.left = self.invertTree(root.right)
        # root.right = self.invertTree(root.left)
        root.left, root.right = self.invertTree(root.right), self.invertTree(root.left)
        return root
  • 注意别踩坑了:
root.left, root.right = self.invertTree(root.right), self.invertTree(root.left)

不应该写成

root.left = self.invertTree(root.right)
root.right = self.invertTree(root.left)

因为第一行修改了root.left,会影响了第二行。在 Python 中,正确的写法是把两行写在同一行,就能保证 root.leftroot.right 的修改是同时进行的。

思路1

  • 自顶向下,递归
class Solution(object):
	def invertTree(self, root):
		"""
		:type root: TreeNode
		:rtype: TreeNode
		"""
		# 递归函数的终止条件,节点为空时返回
		if not root:
			return None
		# 将当前节点的左右子树交换
		root.left,root.right = root.right,root.left
		# 递归交换当前节点的 左子树和右子树
		self.invertTree(root.left)
		self.invertTree(root.right)
		# 函数返回时就表示当前这个节点,以及它的左右子树
		# 都已经交换完了		
		return root

相关知识

疑问

参考

[1] 递归函数怎么写?本文帮助你理解递归
[2] 动画演示 两种实现 226. 翻转二叉树

你可能感兴趣的:(Leetcode,二叉树,leetcode,算法,python)