每天一道算法题——二叉树的镜像

题目描述
操作给定的二叉树,将其变换为源二叉树的镜像。
输入描述:
二叉树的镜像定义:源二叉树
     8
    / \
6       10
/ \       / \
5 7      9 11
镜像二叉树
      8
    / \
10       6
/ \       / \
11 9      7 5
测试用例:
{8,6,10,5,7,9,11}
对应输出应该为:
{8,10,6,11,9,7,5}

分析:

  1. 做一个临时变量,使左子节点和右子节点的值进行交换,对子树走递归处理即可

  2. 设计一个栈,将输入的代表树的数列push到栈中,再将其pop出来,这样实现反转的效果,再针对这个新的树做左右子树的替换(只要左右子树有一个不为null就替换),再将非空的左右子节点分别push到栈中,即可实现镜像处理。
    就好比字符串的反转一样——”I am a student.” -> “student. a am I”
    我们可以先将整个字符串对象整个反转过来,即:”.tneduts a ma I”然后再针对每个单词做一个反转,得到—— “student. a am I”
    但是需要注意的是这一种方式使用到了栈,所以需要在程序中添加import java.util.Stack这条语句。

源码:

第一种:

class TreeNode {//二叉树结构的类定义
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

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

    }

}
public class Test1 {
    public void Mirror(TreeNode root) {
        if (root != null) {// 如果root非空,则继续向下进行

            TreeNode temp;// 设置临时变量作为交换中转
            temp = root.left;
            root.left = root.right;
            root.right = temp;
            if (root.left != null) {// 当左子节点不为空,则递归调用Mirror方法
                Mirror(root.left);
            }
            if (root.right != null) {
                Mirror(root.right);
            }
        }
    }
}

第二种:

import java.util.Stack;

class TreeNode {// 二叉树结构的类定义
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

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

    }

}

public class Test1 {
    public void Mirror(TreeNode root) {
        if (root!= null) {
            Stack<TreeNode> stack = new Stack<TreeNode>();
            stack.push(root);
            while (!stack.isEmpty()) {
                TreeNode t1 = stack.pop();
                if (t1.left!=null ||t1.right !=null) {
                    TreeNode temp;// 设置临时变量作为交换中转
                    temp = t1.left;
                    t1.left = t1.right;
                    t1.right = temp;
                }
                if (t1.left != null) {// 当左子节点不为空就将其push到栈中。
                    stack.push(t1.left);
                }
                if (t1.right != null) {
                    stack.push(t1.right);
                }
            }
        }
    }
}

运行测试:

第一种:
运行时间:29ms
占用内存:8880k
第二种:
运行时间:22ms
占用内存:8676k

总结:
总体来说是第一种方法递归更加的容易理解和记忆。但是也有着递归的通病。
第二种方法更加的巧妙。
但是这个题,里面的方法应该设置成有返回值得更好一点吧。这样void算是什么。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值