算法篇:树之翻转树

news/2024/7/20 22:04:05 标签: 二叉树, 算法, leetcode, 数据结构, ios

算法

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

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

解法:

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))
}

执行结果:


http://www.niftyadmin.cn/n/873122.html

相关文章

window.close

关闭窗口,不弹出系统提示,直接关闭 window.openernull window.open("","_self") window.close(); 若只有window.close();会有对话框提示

fmc是fpga直接引出来的吗_时间旅行存在吗?过去、现在、未来、也许只是观察者的状态不同...

我们继续来讨论时间,时间对于我们来说,是如此重要,它即是生命也是金钱。今天的故事发生在列车上,只是不是那种艳遇故事。它是关于相对论中爱因斯坦的火车试验。对于讨论过去、现在、未来我们先要有一个事件的概念,对于…

算法篇:树之对称二叉树

算法:本题目主要是对题目的理解,对称二叉树是一个镜像的概念:举个形象的例子,对称二叉树就是沿着根节点垂直画一条线,然后两边的左右子树对折起来能够重合,这就是对称二叉树,具体场景如下所示&a…

mysql实现编号生成_mysql编号生成_MySQL

1、序列号生成的方法DELIMITER $$CREATE DEFINERrootlocalhost FUNCTION get_workNo() RETURNS varchar(45) CHARSET utf8BEGINDECLARE newWorkNo varCHAR (45) ;DECLARE currentDate varCHAR (15) ;-- 当前日期,有可能包含时分秒DECLARE maxNo INT DEFAULT 0 ;DECLARE oldWork…

算法篇:树之二叉树的恢复

算法:该类题目的核心在于利用前序或者后序遍历找到根节点,利用中序遍历分成左右两棵子树,然后递归操作即可。前序遍历:根节点,左子树,右子树 中序遍历:左子树,根节点,右子…

navicat怎么对mysql操作_navicat中对数据库操作的方法介绍

本篇文章给大家带来的内容是关于navicat中对数据库操作的方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。navicat我觉得做程序的基本上都会用,它方便,快捷,直观等,优点…

笔试面试:算法题目大汇总

最近灰子在整理算法题,并按照数据结构进行了归类整理,要整理好一整子了。题目都是来自leet-code的原题,笔者用go语言进行了实现。目前整理完了链表,正在整理树,欢迎大家关注: 目录 :灰子学算法…

mysql timestamp 默认格式_MySQL-TIMESTAMP(3)的默认值

小编典典根据文档timestamp并datetime输入列:如果TIMESTAMP或DATETIME列定义在任何地方都包含显式的小数秒精度值,则在整个列定义中必须使用相同的值。这是允许的:CREATE TABLE t1 (ts TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) ON UPDATEC…