翻转二叉树的若干种解法

题目描述

在这里插入图片描述

我的解法

思路

从结果来看,就是将每个节点的左右子节点互换了;
方法上属于层序遍历,适合使用队列结构;
具体实现,即使用基础的层序遍历方法,不过有两点区别:

  • 将子节点加入队列时调整下顺序,先加入右节点,再加入左节点;
  • 添加成功后才将当前节点弹出,因为要对当前节点的左右节点进行更改

以上的思路关键的地方在于:需要对每个节点的左右子节点进行修改,但是修改之前需要记录下原来节点的信息

那这么说也可以先将左右节点顺序进行修改,然后再按照原本的层序遍历方法不进行改动

层序遍历的迭代法

对应Java代码

在这里插入图片描述

class Solution {
    public TreeNode invertTree(TreeNode root) {
        TreeNode node = root;
        Deque<TreeNode> qu = new LinkedList<TreeNode>();
        if(node != null) {qu.offerLast(node);}
        while(!qu.isEmpty()){
            node = qu.pollFirst();
            TreeNode tmp = node.left;
            node.left = node.right;
            node.right = tmp;
            if(node.left != null) {qu.offerLast(node.left);}
            if(node.right != null) {qu.offerLast(node.right);}
        }
        return root;
    }
}

复杂度分析

时间复杂度:O(n) 只对二叉树进行了一次遍历
空间复杂度:O(1) 额外定义了一个节点的空间用来进行左右子树交换

收获总结

既然只是需要将每个节点的左右子节点交换一下,其实所有遍历方法都可以(中序遍历不行,它会将部分节点反转两次),只需要在正常的遍历流程中,添加翻转这一步骤,既然这样的话,写法就很多了,前、后序遍历的递归法、迭代法,层序遍历的迭代法、递归法等,这里再尝试下后序遍历的递归法

后序遍历的递归法

对应Java代码

在这里插入图片描述

class Solution {
    public TreeNode invertTree(TreeNode root) {
        invertNode(root);
        return root;
    }
    public void invertNode(TreeNode node) {
        if(node == null) {return;}
        invertNode(node.left);
        invertNode(node.right);
        TreeNode tmp = node.left;
        node.left = node.right;
        node.right = tmp;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值