高频算法面试题(四十一)- 翻转二叉树

200 阅读2分钟

「这是我参与11月更文挑战的第 26 天,活动详情查看:2021最后一次更文挑战

刷算法题,从来不是为了记题,而是练习把实际的问题抽象成具体的数据结构或算法模型,然后利用对应的数据结构或算法模型来进行解题。个人觉得,带着这种思维刷题,不仅能解决面试问题,也能更多的学会在日常工作中思考,如何将实际的场景抽象成相应的算法模型,从而提高代码的质量和性能

树的直径

题目来源LeetCode - 226. 翻转二叉树

题目描述

翻转一棵二叉树

示例

输入:


     4
   /   \
  2     7
 / \   / \
1   3 6   9

输出:

     4
   /   \
  7     2
 / \   / \
9   6 3   1

解题

解法一:递归

思路

其实这道题,最容易想到的是层序遍历来解决,因为从题目中可以看出来,就是每一层中节点的位置交换。通过辅助队列来实现层序遍历,不同的是,每一层数据交换完成之后,再进行下一层。是一种自顶向下的解决方式,这种实现考虑的细节比较多,实现起来稍微麻烦一点

一种更简单的方式是用递归。首先我们要反转一颗二叉树,那如果把左右子树反转了,这个二叉树就被翻转了,又是这种把一个大问题化解成相同思路的小问题,很容易想到递归

按照这种递归的思路,其实就是遍历到叶子结点才开始反转,反转操作很简单,就是父节点的左右指针的指向互换

做了这么多的二叉树的题,发现基本的都可以用递归来解,所以在做二叉树的题的时候,不应该再像做一些常规的题的一些思路。先看大的问题能不能分解成相同的小问题来解决

代码很容易理解,直接上代码

代码

//二叉树翻转
func invertTree(root *TreeNode) *TreeNode {
	if root == nil {
		return nil
	}

	left := invertTree(root.Left)
	right := invertTree(root.Right)
	root.Left = right
	root.Right = left

	return root
}