算法篇(树之翻转树)
算法:
个人觉得这种类型题目的根本在于对题目的理解,所以理解翻转二叉树的定义就很重要。
我们先看下什么是翻转二叉树:翻转的意思就是根节点不变,左右子树交换位置,当然这里的左右子树也得是翻转之后的二叉树。
解法:
1.空节点和单个节点的二叉树是不需要翻转的。
2.1)两个以上的节点的二叉树,首先翻转各自的左右子树,
2)然后与根节点的左右子树交换位置。
题目1:
https://leetcode-cn.com/problems/invert-binary-tree/
文章图片
代码实现:
/**
* Definition for a binary tree node.
* type TreeNode struct {
*Val int
*Left *TreeNode
*Right *TreeNode
* }
*/
func invertTree(root *TreeNode) *TreeNode {
// 1.根节点是nil直接返回
if root == nil {
return root
}
// 2. 左右节点先翻转子树,再翻转孩子
l := invertTree(root.Left)
r := invertTree(root.Right)
root.Left,root.Right = r,l
return root
}
执行结果:
文章图片
题目2:
解法:
是题目1的变形题目:二叉树部分翻转
我们观察翻转二叉树会发现,翻转后的节点他们所处的层次没有变化,
只是左右交换了位置,基于这个原因,我们将本题目拆分成。
1.两棵树的左子树与右子树都相同。
2.两棵树的左子树==右子树,并且右子树==左子树。
3.两棵树都为nil的话,是相同的。
4.两棵树一棵为nil,则不相同。
5.两棵树的根节点数值不相同则整棵树就不相同。
https://leetcode-cn.com/problems/flip-equivalent-binary-trees/
文章图片
代码实现:
/**
* Definition for a binary tree node.
* type TreeNode struct {
*Val int
*Left *TreeNode
*Right *TreeNode
* }
*/
func flipEquiv(root1 *TreeNode, root2 *TreeNode) bool {
// 1. root1,root2 都为nil的情况
if root1 == root2 {
return true
}
// 2. root1,root2有一个为nil,另一个不为nil 或者 root1与root2不相同
if root1 == nil || root2 == nil || root1.Val != root2.Val {
return false
}
// 3. root1,root2都相同,进一步检查他们的孩子,无非就是下面两种
return (flipEquiv(root1.Left,root2.Left) && flipEquiv(root1.Right,root2.Right)) ||
(flipEquiv(root1.Right,root2.Left)&& flipEquiv(root1.Left,root2.Right))
}
执行结果:
【算法篇(树之翻转树)】
文章图片
推荐阅读
- 2018年11月19日|2018年11月19日 星期一 亲子日记第144篇
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- 拍照一年啦,如果你想了解我,那就请先看看这篇文章
- 画解算法(1.|画解算法:1. 两数之和)
- 亲子日记第186篇,2018、7、26、星期四、晴
- Guava|Guava RateLimiter与限流算法
- 漫画初学者如何学习漫画背景的透视画法(这篇教程请收藏好了!)
- 两短篇
- 第四十三篇接纳孩子的感受
- 感恩日记第111篇2020.02.06