二叉树的翻转

目录

一、题目

二、解题思路

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)子节点:除了根节点,连接有节点的节点。

如下图:

二叉树的翻转_第1张图片

 2、具体步骤(迭代法)

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

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

二叉树的翻转_第2张图片

 

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

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

        ②队列元素出队;

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

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

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

二叉树的翻转_第3张图片

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

 二叉树的翻转_第4张图片

 

 二叉树的翻转_第5张图片

 

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

二叉树的翻转_第6张图片

 二叉树的翻转_第7张图片

二叉树的翻转_第8张图片 

二叉树的翻转_第9张图片

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

二叉树的翻转_第10张图片 

三、代码实现 

(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 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;
    }
}

你可能感兴趣的:(二叉树题解--java,leetcode,动态规划,算法,java)