[路飞]_leetcode刷题__226. 翻转二叉树

1,061 阅读2分钟

「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战

题目

226. 翻转二叉树

翻转一棵二叉树。

示例:

输入:

     4
   /   \
  2     7
 / \   / \
1   3 6   9

输出:

     4
   /   \
  7     2
 / \   / \
9   6 3   1

解法一

思路

二叉树的后序遍历。

我们可以递归的去遍历整颗树,递归的将当前根节点的左子树和右子树分别都反转,然后再将当前根节点的左子树和右子树反转即可,很显然,我们采用二叉树的后序遍历就刚好可以满足要求。

具体步骤如下

  1. 判断当前是否为空,如果是,则return,这其实也是递归终止条件
  2. 递归调用当前方法去处理左子树,将左子树递归的翻转完成
  3. 递归的去处理右子树,将右子树递归的翻转完成
  4. 然后再将当前节点的左子树和右子树交换

按以上步骤即可完成,是一个标准的二叉树的后序遍历。

代码如下

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {TreeNode}
 */
var invertTree = function(root) {
    if(root == null){
        return null
    };
    let left = invertTree(root.left);
    let right = invertTree(root.right);
    root.left = right;
    root.right = left;
    return root;
};

复杂度分析

时间复杂度:O(n),n为二叉树的节点数,因为我们需要去遍历二叉树的所有节点。

空间复杂度:O(n),空间复杂度由递归栈的层数决定,也即这里的二叉树的高度。平均状况下,二叉树的高度为logn,最坏的情况下,二叉树是一个联调,那么复杂度即为O(n)。

解法二

思路:

二叉树的中序遍历。

刚才用后序遍历,其实是先遍历到叶子节点,然后交换左右叶子节点,再返回上一级,去交换对称的两个叶子节点,然后再往上,将刚才处理好的两颗子树交换,然后再往上,一级一级的处理。

而采用中序遍历的话,刚好相反,上来就先将根节点的左右子树交换,然后再去处理左子树,将左子树根节点的两颗子树交换,依次往下,同理,然后再去处理右子树,整体思路刚好是相反的。

代码如下

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {TreeNode}
 */
var invertTree = function(root) {
    if(root == null){
        return null;
    }
    let tmp = root.left;
    root.left = root.right;
    root.right = tmp;
    invertTree(root.left);
    invertTree(root.right);
    return root;
};

复杂度分析

同上。