「这是我参与11月更文挑战的第 26 天,活动详情查看:2021最后一次更文挑战」
刷算法题,从来不是为了记题,而是练习把实际的问题抽象成具体的数据结构或算法模型,然后利用对应的数据结构或算法模型来进行解题。个人觉得,带着这种思维刷题,不仅能解决面试问题,也能更多的学会在日常工作中思考,如何将实际的场景抽象成相应的算法模型,从而提高代码的质量和性能
树的直径
题目描述
翻转一棵二叉树
示例
输入:
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
}