[树遍历的应用] 226. 翻转二叉树(递归DFS、迭代BFS)

12 篇文章 0 订阅
7 篇文章 0 订阅

226. 翻转二叉树

题目链接:https://leetcode-cn.com/problems/invert-binary-tree/


分类:

  • 树(翻转二叉树、树的遍历:递归DFS,迭代BFS + 在遍历过程中翻转)

在这里插入图片描述

思路1:递归(DFS)

算法流程:

  1. 鲁棒性验证,快速处理边界用例

  2. 创建backup节点用于存放根节点,用于返回镜像树的根节点。

  3. 调用traverseAndMirror函数递归实现DFS遍历+翻转左右孩子:

    (1)在遍历到的每个点上,交换它的左右孩子(包括null);再对它的左右子树调用traverseAndMirror,重复相同操作,

    (2)直到遍历到叶子节点上时,不做任何处理,直接返回。

实现遇到的问题:特殊用例的处理
  • 功能测试:树不止一个节点
  • 边界测试:树为空;树只有一个节点
class Solution {
    public TreeNode invertTree(TreeNode root) {
        //1、鲁棒性验证
        if(root == null || (root.left == null && root.right == null)){
            return root;
        }
        //2、用于返回镜像树的根节点。
        TreeNode backup = root;
        //3、调用求二叉树镜像函数
        traverseAndMirror(root);
        return backup;
    }

    //前序遍历+镜像操作
    public void traverseAndMirror(TreeNode root){
        //递归出口:遍历到叶子节点上时,不做任何处理,直接返回。
        if(root == null || (root.left == null && root.right == null)){
            return;
        }
        //交换当前节点的左右孩子,并递归处理它的左右子树
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp; 
        traverseAndMirror(root.left);
        traverseAndMirror(root.right);      
    }
}

思路2:迭代(BFS)

BFS对树而言就是层次遍历,层次遍历的实现前面已经做过很多次。

算法流程:

  1. 开辟一个队列用于层次遍历,先将根节点入队;
  2. 获取队列元素个数n,依次弹出n次队首,每弹出一个队首节点,就将其左右孩子调换,然后分别加入队列中。
  3. 队列为空时退出循环。
class Solution {
    public TreeNode invertTree(TreeNode root) {
        //鲁棒性验证
        if(root == null || (root.left == null && root.right == null)){
            return root;
        }
        //队列用于层次遍历
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            int n = queue.size();
            for(int i = 0; i < n; i++){
                TreeNode top = queue.poll();
                TreeNode temp = top.left;
                top.left = top.right;
                top.right = temp;
                if(top.left != null) queue.offer(top.left);
                if(top.right != null) queue.offer(top.right);
            }
        }
        return root;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值