首页 > 其他分享 >226. 翻转二叉树

226. 翻转二叉树

时间:2022-10-15 15:33:40浏览次数:96  
标签:traverse 遍历 invertTree 二叉树 226 root 节点 翻转

题目描述

image

解题思路

二叉树的题一般都有对应的模板,我们做题时可以参考对应模板
二叉树解题的思维模式分两类:

  • 1、是否可以通过遍历一遍二叉树得到答案?如果可以,用一个 traverse 函数配合外部变量来实现,这叫「遍历」的思维模式。

  • 2、是否可以定义一个递归函数,通过子问题(子树)的答案推导出原问题的答案?如果可以,写出这个递归函数的定义,并充分利用这个函数的返回值,这叫「分解问题」的思维模式。

无论使用哪种思维模式,你都需要思考:

如果单独抽出一个二叉树节点,它需要做什么事情?需要在什么时候(前/中/后序位置)做?其他的节点不用你操心,递归函数会帮你在所有节点上执行相同的操作。

解题步骤

1、这题能不能用「遍历」的思维模式解决?

可以,我写一个 traverse 函数遍历每个节点,让每个节点的左右子节点颠倒过来就行了。

单独抽出一个节点,需要让它做什么?让它把自己的左右子节点交换一下。

需要在什么时候做?好像前中后序位置都可以。

综上,可以写出如下解法代码

// 主函数
TreeNode invertTree(TreeNode root) {
    // 遍历二叉树,交换每个节点的子节点
    traverse(root);
    return root;
}

// 二叉树遍历函数
void traverse(TreeNode root) {
    if (root == null) {
        return;
    }

    /**** 前序位置 ****/
    // 每一个节点需要做的事就是交换它的左右子节点
    TreeNode tmp = root.left;
    root.left = root.right;
    root.right = tmp;

    // 遍历框架,去遍历左右子树的节点
    traverse(root.left);
    traverse(root.right);
}

你把前序位置的代码移到后序位置也可以,但是直接移到中序位置是不行的,需要稍作修改,这应该很容易看出来吧,我就不说了。

按理说,这道题已经解决了,不过为了对比,我们再继续思考下去。

2、这题能不能用「分解问题」的思维模式解决?

然后思考,对于某一个二叉树节点 x 执行 invertTree(x),你能利用这个递归函数的定义做点啥?

我可以用 invertTree(x.left) 先把 x 的左子树翻转,再用 invertTree(x.right) 把 x 的右子树翻转,最后把 x 的左右子树交换,这恰好完成了以 x 为根的整棵二叉树的翻转,即完成了 invertTree(x) 的定义。

直接写出解法代码:

var invertTree = function(root) {
    const reverse= function(root) {
        if(!root) return root
        let temp = root.left
        root.left = reverse(root.right)
        root.right = reverse(temp)
        return root
    }
    let res = reverse(root)
    return res
};

参考链接

标签:traverse,遍历,invertTree,二叉树,226,root,节点,翻转
From: https://www.cnblogs.com/zx529/p/16794289.html

相关文章

  • 617. 合并二叉树
    /***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(......
  • 124.二叉树的最大路径和
    路径被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中至多出现一次。该路径至少包含一个节点,且不一定经过根节点......
  • 代码随想录 反转字符串(LeetCode 344) ,反转字符串II(LeetCode 541),替换空格(剑指offer
    反转字符串题目编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组char[]的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用......
  • 图的广度优先搜索和二叉树的层序遍历其实差不多
    图的广度优先搜索和二叉树的层序遍历其实差不多,不同的是在图中没有根节点,你可以随便选择一个节点,当作起始节点,和二叉树的一样入队,访问,出队,判断顶点是否有邻接顶点,如果有邻......
  • 94. 二叉树的中序遍历 (easy)
     递归:左根右 /***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nul......
  • 计算二叉树的最大宽度
    求非空二叉树的宽度算法思想:层序遍历二叉树,并用两个队列A,B交替存储结点,当队列A中元素为空时队列B就存储了下一层的所有结点,同理,队列B为空时队列A也就存储了下一层的所有......
  • 代码随想录 | 进阶二叉树
    二叉树的构造默认如下:/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;*TreeNoderight;*......
  • 二叉树的序列化和反序列化
    二叉树的序列化和反序列化作者:Grey原文地址:博客园:二叉树的序列化和反序列化CSDN:二叉树的序列化和反序列化题目链接见:LeetCode297.SerializeandDeserializeBinary......
  • 算法练习-第十七天【二叉树】
    二叉树110.平衡二叉树参考:代码随想录思路二叉树的深度:从根节点出发到该节点的最长简单路径边的条数。二叉树的高度:从该节点出发到叶子节点的最长简单路径的条数。题......
  • 计算二叉树中度为二的结点个数
    计算度为二的结点个数递归法(一)算法思想:用递归的数学模型来理解:f(b)=0//若b是空树则本身不是度为二的结点,也无左右孩子,总共的度为二结点......