前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >算法篇:树之翻转树

算法篇:树之翻转树

作者头像
灰子学技术
发布2020-08-05 23:38:49
5911
发布2020-08-05 23:38:49
举报
文章被收录于专栏:灰子学技术灰子学技术

算法:

个人觉得这种类型题目的根本在于对题目的理解,所以理解翻转二叉树的定义就很重要。

我们先看下什么是翻转二叉树:翻转的意思就是根节点不变,左右子树交换位置,当然这里的左右子树也得是翻转之后的二叉树。

解法:

1.空节点和单个节点的二叉树是不需要翻转的。

2.1)两个以上的节点的二叉树,首先翻转各自的左右子树,

2)然后与根节点的左右子树交换位置。

题目1:

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

代码实现:

代码语言:javascript
复制
/**
 * 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/

代码实现:

代码语言:javascript
复制
/**
 * 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))
}

执行结果:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 灰子学技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档