美文网首页算法专题
[算法学习]--反转二叉树

[算法学习]--反转二叉树

作者: Alex_LoveYing | 来源:发表于2019-07-12 10:16 被阅读0次

方法一 (递归)

这是一个非常经典的树的问题,这个问题很适合用递归方法来解决。

算法

反转一颗空树结果还是一颗空树。对于一颗根为 r,左子树为 \mbox{right}, 右子树为 \mbox{left} 的树来说,它的反转树是一颗根为 r,左子树为 \mbox{right} 的反转树,右子树为 \mbox{left} 的反转树的树。

public TreeNode invertTree(TreeNode root) {
    if (root == null) {
        return null;
    }
    TreeNode right = invertTree(root.right);
    TreeNode left = invertTree(root.left);
    root.left = right;
    root.right = left;
    return root;
}

复杂度分析

既然树中的每个节点都只被访问一次,那么时间复杂度就是 O(n),其中 n 是树中节点的个数。在反转之前,不论怎样我们至少都得访问每个节点至少一次,因此这个问题无法做地比 O(n) 更好了。

本方法使用了递归,在最坏情况下栈内需要存放 O(h)个方法调用,其中 h 是树的高度。由于 h∈O(n),可得出空间复杂度为 O(n)。

方法二 (迭代)

我们也可以用迭代方法来解决这个问题,这种做法和深度优先搜索(Breadth-fist Search, BFS)很接近。

算法

这个方法的思路就是,我们需要交换树中所有节点的左孩子和右孩子。因此可以创一个队列来存储所有左孩子和右孩子还没有被交换过的节点。开始的时候,只有根节点在这个队列里面。只要这个队列不空,就一直从队列中出队节点,然后互换这个节点的左右孩子节点,接着再把孩子节点入队到队列,对于其中的空节点不需要加入队列。最终队列一定会空,这时候所有节点的孩子节点都被互换过了,直接返回最初的根节点就可以了。

public TreeNode invertTree(TreeNode root) {
    if (root == null) return null;
    Queue<TreeNode> queue = new LinkedList<TreeNode>();
    queue.add(root);
    while (!queue.isEmpty()) {
        TreeNode current = queue.poll();
        TreeNode temp = current.left;
        current.left = current.right;
        current.right = temp;
        if (current.left != null) queue.add(current.left);
        if (current.right != null) queue.add(current.right);
    }
    return root;
}

复杂度分析

既然树中的每个节点都只被访问/入队一次,时间复杂度就是 O(n),其中 n 是树中节点的个数。

空间复杂度是 O(n),即使在最坏的情况下,也就是队列里包含了树中所有的节点。对于一颗完整二叉树来说,叶子节点那一层拥有 ⌈n/2⌉=O(n)个节点。

相关文章

  • 二叉树

    title: 二叉树date: 2016-08-16 14:47:21tags: 算法 二叉树 二叉树的反转

  • 02-13:leetcode重刷2之链表反转

    1、链表反转 2、反转二叉树 3、合并二叉树 4、对称二叉树 1、反转链表 classSolution: defr...

  • [算法][2]反转二叉树

    前言 继续继续算法第二篇 题目 简单描述: 反转二叉树 问题详情Invert Binary Tree. 解法: 1...

  • 算法总结

    基本排序算法 二叉树三种遍历方式 反转链表 反转链表的m到n个节点 股票买入卖出最大利润 全排列 去重的全排列 L...

  • [算法学习]--反转二叉树

    方法一 (递归) 这是一个非常经典的树的问题,这个问题很适合用递归方法来解决。 算法 反转一颗空树结果还是一颗空树...

  • Golang反转二叉树

    反转二叉树

  • 二叉树遍历

    二叉树 二叉树的存储结构 前序遍历 中序遍历 后序遍历 遍历代码 反转二叉树 深入学习二叉树 二叉树-你必须要懂!...

  • python完全二叉树

    通过实现完全二叉树,学习其相应的递归算法

  • 一些简单的面试经典算法题目

    1. 反转二叉树 解:运用递归;反转左子树,反转右子树,交换左右子树 2.反转单链表 解: 递归解法:Javapu...

  • 每日Leetcode—算法(10)

    100.相同的树 算法: 101.对称二叉树 算法: 104.二叉树的最大深度 算法: 107.二叉树的层次遍历 ...

网友评论

    本文标题:[算法学习]--反转二叉树

    本文链接:https://www.haomeiwen.com/subject/yxaskctx.html