二叉树的翻转

目录

 

一、题目

二、解题思路

1、二叉树翻转

 2、具体步骤(迭代法)

三、代码实现 


 

一、题目

1、leetcode链接:力扣

2、题目内容:

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

 

示例 1:

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

 

二、解题思路

1、二叉树翻转

(1)就是将根节点和所有子节点的左右子树进行交换;

(2)根节点:树的最顶端的节点,每颗树只有一个根节点;

(3)子节点:除了根节点,连接有节点的节点。

如下图:

ae47ead0760148baaf16ac07322ce3a7.png

 2、具体步骤(迭代法)

(1)我们需要借助队列来实现,队列的特点是先进先出;

(2)判断树是否为空,不为空,让根节点进入队列;

919015f6342945ef890f33724265fe3b.png

 

 (3)判断队列是否为空,为空则结束,不为空:

        ①记录当前队列长度,根据该长度进行遍历;

        ②队列元素出队;

        ③交换出队元素的左右子树;

        ④判断左节点是否为空,不为空,入队;

        ⑤判断右节点是否为空,不为空,入队;

ca89ecd21fd140cda8a2eb98459da604.png

(4)第二层操作,重复以上步骤

 1360f8e4ef0b4fbbb21f0ae599a3cd8e.png

 

 1c26d317a712433daddacd6e66d3e6f2.png

 

(5)第三层操作,重复以上步骤

e1918c1b46984f338b34ffd5a362866b.png

 03a3d34ce1bb44fb8cca1b2ad55dd300.png

 

d439a6e47aa946069474eec7b903c3ac.png 

656d1df967914f7d90c6bd979b22ec6d.png

 

(6)队列为空,二叉树翻转完成 

67ab7e9eb4774bd492439102182dab9c.png 

三、代码实现 

(1)首先要判断树是否为空,为空则不进行操作;

(2)每层操作之前,要用一个定值记录当前树长度,因为开始出队入队操作时,队列的长度是不断变化的。

public class t06 {
    public static class TreeNode {
      int val;
      TreeNode left;
      TreeNode right;
      TreeNode() {}
      TreeNode(int val) { this.val = val; }
      TreeNode(int val, TreeNode left, TreeNode right) {
          this.val = val;
          this.left = left;
          this.right = right;
      }
    }

    public TreeNode invertTree(TreeNode root) {
        if (root==null){
            return root;
        }
        Queue<TreeNode> queue=new LinkedList<>();
        queue.add(root);
        while (!queue.isEmpty()){
            //记录当前队列长度
            int len=queue.size();
            for (int i = 0; i < len; i++) {
                TreeNode node=queue.poll();
                TreeNode temp=node.left;
                node.left=node.right;
                node.right=temp;
                if (node.left!=null){
                    queue.add(node.left);
                }
                if (node.right!=null){
                    queue.add(node.right);
                }

            }
        }
        return root;
    }
}

 

 

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

swttws.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值