补第7天 输入一个二叉树,该函数输出它的镜像。

来源:互联网 发布:mac系统基础教程视频 编辑:程序博客网 时间:2024/06/07 13:19


题目: 请完成一个函数,输入一个二叉树,该函数输出它的镜像。

如下图



上图左侧是二叉树,右侧二叉树是左侧的镜像,可以看出每一层都与左侧二叉树是相反的。

左侧前序遍历是8, 6, 5, 7, 10, 9, 11

右侧二叉树前序遍历是8, 10, 11, 9, 6, 7, 5


但是上图是一个完整二叉树必须考虑当不是完整二叉树的时候程序是否依然可以运行,下图是演示当二叉树非完整二叉树时镜像:

左侧前序遍历是10, 8, 7, 9, 15

右侧二叉树前序遍历是8, 15, 8, 9, 7




以下是完整代码,并且在mian函数中使用以上的左侧的输入作为输入,如果结果与右侧二叉树的前序遍历结果相同则说明程序没问题

代码中用到的二叉树源码:

http://blog.csdn.net/androiddevelop/article/details/18567085


/** *  面试题19 请完成一个函数,输入一个二叉树,该函数输出它的镜像。 *   *  出错:不是遍历交换左右树的值,而是需要交换整个左右子节点 *  如果是前者仅颠倒当前层级节点,其下级节点还是在原来位置 *   *  2014-1-22 */public class MirrorOfBinaryTree<T> {public void mirrorRecursively(Node<T> root) {if (root == null) {return;}Node<T> leftNode = root.getLeftNode();Node<T> rightNode = root.getRightNode();if (leftNode != null || rightNode != null) {//T temp = leftNode.getData();//leftNode.setData(rightNode.getData());//rightNode.setData(temp);root.setLeftNode(rightNode);root.setRightNode(leftNode);mirrorRecursively(leftNode);mirrorRecursively(rightNode);}}public static void main(String[] args) {MirrorOfBinaryTree<Integer> mirror = new MirrorOfBinaryTree<Integer>();Integer[] data1 = {8, 6, 5, null, null, 7, null, null, 10, 9, null, null, 11, null, null}; BinaryTree<Integer> tree1 = new BinaryTree<Integer>();tree1.createTree(data1);System.out.println("树1前序遍历");tree1.preorderTraversal(tree1.getRootNode());mirror.mirrorRecursively(tree1.getRootNode());System.out.println("\n镜像树1前序遍历");tree1.preorderTraversal(tree1.getRootNode());//Integer[] data2 = {10, 8, 7, 6, null, null, 9, null, null, 15, null, null}; Integer[] data2 = {10, 8, 7, null, null, 9, null, null, 15, null, null}; BinaryTree<Integer> tree2 = new BinaryTree<Integer>();tree2.createTree(data2);System.out.println("\n\n树2前序遍历");tree2.preorderTraversal(tree2.getRootNode());System.out.println();mirror.mirrorRecursively(tree2.getRootNode());System.out.println("\n镜像树2前序遍历");tree2.preorderTraversal(tree2.getRootNode());}}

参考资料:

《剑指offer》面试题19


0 0
原创粉丝点击