27.二叉树的镜像

二叉树的镜像.png
  • 思路:
    (1) 我们可以发现交换的是所有的非叶子节点而不是节点的值,因此使用先序遍历的方法遍历所有非叶子节点(该节点只要有孩子节点就是非叶子节点)。
    (2) 层序打印二叉树的节点,创建一个ArrayList集合用于存放打印的节点的值,创建Queue队列,使得二叉树节点入队,再根据出入队的原则实现层序遍历。
    具体代码如下:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;

/**
 * @program: soft_test
 * @description: 二叉树的镜像
 * @author: Mr.zuo
 * @create: 2021-01-11 11:15
 **/

public class MirrorTree {
    static int[] arr = new int[7];
    static int i = 0;
    public static void main(String[] args) {

        TreeNode node = new TreeNode(4);
        node.left = new TreeNode(2);
        node.right = new TreeNode(7);
        node.left.left = new TreeNode(1);
        node.left.right = new TreeNode(3);
        node.right.left = new TreeNode(6);
        node.right.right= new TreeNode(9);
        ArrayList<Integer> result = print(node);
        for (Integer value: result) {
            System.out.print(value+" ");
        }
        System.out.println();
        TreeNode treeNode = mirrorTree(node);
        ArrayList<Integer> newRes = print(treeNode);
        for (Integer value: newRes) {
            System.out.print(value+" ");
        }
    }

    /**
     * 前序遍历二叉树,交换左右子节点
     * */
    public static TreeNode mirrorTree(TreeNode root){
        if (root == null || (root.left == null && root.right == null)){
            return root;
        }
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;
        if (root.left != null){
            mirrorTree(root.left);
        }
        if (root.right != null){
            mirrorTree(root.right);
        }
        return root;
    }
    public static ArrayList<Integer> print(TreeNode node){
        // 创建list集合用于存放数的节点的值
        ArrayList<Integer> list = new ArrayList<>();
        if (node == null){
            return list;
        }
        // 创建队列
        Queue<TreeNode> queue = new LinkedList<>();
        // 头结点入队
        queue.add(node);
        // 遍历队内元素
        while (queue.size() != 0){
            // 检查并删除队头元素
            TreeNode temp = queue.poll();
            // 队头元素加入List集合中
            list.add(temp.val);
            if (null != temp.left){
                // 左子树不为空
                    queue.add(temp.left);
            }
            if (null != temp.right){
                // 右子树不为空
                queue.add(temp.right);
            }
        }
        return list;
    }
}

public class TreeNode {
    // 节点的值
    int val;
    // 左子树
    TreeNode left;
    // 右子树
    TreeNode right;
    TreeNode(int val){
        this.val = val;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 题干 请完成一个函数,输入一棵二叉树,该函数输出它的镜像。二叉树节点的定义如下: 解题思路 输入二叉树 输出二叉树...
    懒人成长阅读 282评论 0 0
  • 面试题27. 二叉树的镜像 题目描述 请完成一个函数,输入一个二叉树,该函数输出它的镜像。 例如输入: 镜像输出:...
    阿星啊阿星阅读 285评论 0 0
  • 题目描述 请完成一个函数,输入一个二叉树,该函数输出它的镜像。 示例 示例 1: 限制:0 <= 节点个数 <= ...
    1只特立独行的猪阅读 157评论 0 0
  • 上一篇文章讲述了树的概念, 特征以及分类, 旨在让我们理解什么是树, 树的一些常用的概念是什么,树的分类有哪些等。...
    DevCW阅读 2,122评论 4 10
  • 树形结构 在前面章节中介绍到的数据结构,都为线性结构,比如链表,数组,队列等,都属于线性结构,类似于通过一根线串在...
    ducktobey阅读 1,308评论 0 0