Java 实现二叉树的镜像

标签: 剑指offer 算法 镜像 Java
17人阅读 评论(0) 收藏 举报
分类:

操作给定的二叉树,将其变换为源二叉树的镜像。

    static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        public TreeNode(int val) {
            this.val = val;
        }
    }

    /**
     * 递归方式对树做镜像处理</br>
     *          x       |       x    </br>
     *      y       z   |   z        y    </br>
     * @param root
     */
    public static void mirror(TreeNode root) {
        // 如果跟节点为空,无需处理
        if (root == null) {
            return;
        }
        // 左子节点和右子节点都为空,无需处理
        if (root.left == null && root.right == null) {
            return;
        }
        // 左子节点不为空,则对该子节点做镜像处理
        if (root.left != null) {
            mirror(root.left);
        }
        // 右子节点不为空,则对该子节点做镜像处理
        if (root.right != null) {
            mirror(root.right);
        }
        // 交换当前节点的左右子节点位置
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;
    }

    /**
     * 使用栈的方式对树做镜像处理</br>
     *          x       |       x    </br>
     *      y       z   |   z        y    </br>
     * @param root
     */
    public static void mirrorByStack(TreeNode root) {
        // 如果跟节点为空,无需处理
        if (root == null) {
            return;
        }
        // 左子节点和右子节点都为空,无需处理
        if (root.left == null && root.right == null) {
            return;
        }
        // 存放需要交换子节点的节点,节点不为null时放入栈中,如果为null,不需要处理所以无需放入stack中
        // 比如当前的树是
        //                5
        //            3       18
        //        2       4
        //一开始根节点5就被放入了栈,但是第一次就取出来了,并交换了其子节点,此时是
        //                5
        //            18      3
        //                2       4
        // 此时将18和3放入stack中,下一次去栈中取出的是3,因为栈是后入先出的,交换其子节点,此时是
        //                5
        //            18      3
        //                4       2
        // 此时将4和2放入stack中,此时栈中的元素时2,4,18,以此取出即可,因为该三个节点都没有子节点
        Stack<TreeNode> stack = new Stack<>();
        // 首先将根节点放入栈中
        stack.push(root);
        // 一直到栈中没有需要交换左右子节点的节点
        while (stack.size() > 0) {
            // 从栈中取出栈顶元素,即需要被交换左右子节点的节点
            TreeNode node = stack.pop();
            // 当前节点任一子节点不为null,则交其左右子节点位置
            if (node.left != null || node.right != null) {
                TreeNode temp = node.left;
                node.left = node.right;
                node.right = temp;
            }

            // 左子节点不为空,则push到栈中,等待之后的处理
            if (node.left != null) {
                stack.push(node.left);
            }
            // 右子节点不为空,则push到栈中,等待之后的处理
            if (node.right != null) {
                stack.push(node.right);
            }
        }
    }

    /**
     * 前序遍历打印树
     * @param root
     */
    private static void printTree(TreeNode root) {
        if (root == null) {
            return;
        }
        System.out.print(root.val + " ");
        printTree(root.left);
        printTree(root.right);
    }

    public static void main(String[] args) {
        TreeNode root = buildTree1();
        printTree(root);
        mirrorByStack(root);
        System.out.println();
        printTree(root);
    }

    /**
     * 创建tree1:</br>
     *              5</br>
     *          3       18</br>
     *      2       4</br>
     * @return
     */
    private static TreeNode buildTree1(){
        TreeNode root = new TreeNode(5);
        TreeNode left = new TreeNode(3);
        TreeNode left1 = new TreeNode(2);
        TreeNode right1 = new TreeNode(4);
        left.left = left1;
        left.right = right1;
        TreeNode right = new TreeNode(18);
        root.left = left;
        root.right = right;
        return root;
    }

查看评论

剑指offer---二叉树的镜像---java实现

题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。  输入描述: 二叉树的镜像定义:源二叉树         8        /  \       6   10      / ...
  • snow_7
  • snow_7
  • 2016-07-04 20:23:10
  • 2549

二叉树的镜像(Java实现)

剑指offer面试题19 牛客网写实地址:https://www.nowcoder.com/questionTerminal/564f4c26aa584921bc75623e48ca3011 ...
  • zjkC050818
  • zjkC050818
  • 2017-04-25 10:16:22
  • 858

笔试面试算法经典--二叉树的镜像-递归与非递归实现(Java)

给出一棵二叉树,求它的镜像,如下图:右边是二叉树是左边二叉树的镜像。解法1(递归)思路1:如果当前节点为空,返回,否则交换该节点的左右节点,递归的对其左右节点进行交换处理。public static ...
  • u013309870
  • u013309870
  • 2017-04-10 19:04:41
  • 1229

剑指offer算法实现java版——面试题19二叉树的镜像

  • 2016年03月14日 20:08
  • 3KB
  • 下载

剑指Offer面试题19(Java版):二叉树的镜像

请完成一个函数,输入一个二叉树,该函数输出它的镜像。
  • jsqfengbao
  • jsqfengbao
  • 2015-08-02 17:03:43
  • 2042

java 操作给定的二叉树,将其变换为源二叉树的镜像。

题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。  输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 /...
  • qq_23217629
  • qq_23217629
  • 2016-06-23 10:15:05
  • 1155

剑指offer面试题:求二叉树的镜像(递归、循环解法及测试用例)

题目:给定二叉树,将其变换为源二叉树的镜像。 二叉树的定义如下: struct TreeNode {     int val;     TreeNode* left;     TreeNode* ...
  • yanxiaolx
  • yanxiaolx
  • 2016-07-25 01:34:25
  • 1958

用循环的方法实现二叉树的镜像

程序中包含了递归方法 和循环方法#include #include using namespace std; struct tree { int value; tree *left; tre...
  • fighting_doudou
  • fighting_doudou
  • 2014-08-11 16:19:33
  • 1267

剑指Offer:面试题19——二叉树的镜像(java实现)

问题描述: 操作给定的二叉树,将其变换为源二叉树的镜像。 二叉树结点定义为: public class TreeNode { int val = 0; TreeNode left ...
  • lilianforever
  • lilianforever
  • 2016-07-07 08:54:37
  • 703

二叉树镜像(C++版)

题目: 给定源二叉树,设计算法实现其镜像。 思路: 对于二叉树问题,需要思考除递归方法外的非递归实现。 本题递归很好实现,对于遍历到的头结点,每次交换其左右子树即可。之后对其子树递归调...
  • u013575812
  • u013575812
  • 2015-11-30 21:28:33
  • 818
    个人资料
    持之以恒
    等级:
    访问量: 17万+
    积分: 2123
    排名: 2万+
    最新评论