P125、面试题19:二叉树的镜像

题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像
二叉树结点的定义如下:
struct BinaryTreeNode{
       int     m_nValue;
       BinaryTreeNode*     m_pLeft;
       BinaryTreeNode*     m_pRight;
}

求一棵树的镜像的过程:我们先前序比遍历这棵树的每个结点,如果遍历到的结点有子结点,就交换它的两个子结点。当交换完所有非叶子结点的左右子结点之后,就得到了树的镜像。
 
测试用例:
1)功能测试(普通二叉树,二叉树的所有结点都没有左子树或者右子树,只有一个结点的二叉树);
2)特殊输入测试(二叉树的根节点为null指针)。
代码实现:
package com.yyq;

/**
 * Created by Administrator on 2015/9/15.
 */
public class MirrorOfBinaryTree {
    public static BinaryTreeNode mirrorOfBinaryTree(BinaryTreeNode pNode) {
        if (pNode == null)
            return null;
        if (pNode.getM_pLeft() == null && pNode.getM_pRight() == null)
            return null;
        BinaryTreeNode pTemp = pNode.getM_pLeft();
        pNode.setM_pLeft(pNode.getM_pRight());
        pNode.setM_pRight(pTemp);
        if (pNode.getM_pLeft() != null)
            mirrorOfBinaryTree(pNode.getM_pLeft());
        if (pNode.getM_pRight() != null)
            mirrorOfBinaryTree(pNode.getM_pRight());
        return pNode;
    }

    //先序遍历
    public static void preprintTree(BinaryTreeNode pRoot) {
        if (pRoot == null)
            return;
        System.out.print(pRoot.getM_nValue() + "\t");
        preprintTree(pRoot.getM_pLeft());
        preprintTree(pRoot.getM_pRight());
    }

    //中序遍历
    public static void midprintTree(BinaryTreeNode pRoot) {
        if (pRoot != null) {
            midprintTree(pRoot.getM_pLeft());
            System.out.print(pRoot.getM_nValue() + "\t");
            midprintTree(pRoot.getM_pRight());
        }
    }

    public static void Test(String testName, BinaryTreeNode pRoot){
        if (testName == null)
            return ;
        System.out.println("previous printing tree is:");
        preprintTree(pRoot);
        System.out.println();
        System.out.println("middle printing tree is:");
        midprintTree(pRoot);

        System.out.println("\n====="+testName+": MirrorRecursively=====");
        BinaryTreeNode pNode1 = mirrorOfBinaryTree(pRoot);
        System.out.println("previous printing tree is:");
        preprintTree(pNode1);
        System.out.println();
        System.out.println("middle printing tree is:");
        midprintTree(pNode1);

        System.out.println("\n====="+testName+": MirrorIteratively=====");
        BinaryTreeNode pNode2 = mirrorOfBinaryTree(pRoot);
        System.out.println("previous printing tree is:");
        preprintTree(pNode2);
        System.out.println();
        System.out.println("middle printing tree is:");
        midprintTree(pNode2);
        System.out.println();
    }

    // ====================测试代码====================
// 测试完全二叉树:除了叶子节点,其他节点都有两个子节点
//            8
//        6      10
//       5 7    9  11
    public static void Test1() {
        System.out.println("\n=====Test1 starts:=====");
        BinaryTreeNode pNode8 = new BinaryTreeNode(8);
        BinaryTreeNode pNode6 = new BinaryTreeNode(6);
        BinaryTreeNode pNode10 = new BinaryTreeNode(10);
        BinaryTreeNode pNode5 = new BinaryTreeNode(5);
        BinaryTreeNode pNode7 = new BinaryTreeNode(7);
        BinaryTreeNode pNode9 = new BinaryTreeNode(9);
        BinaryTreeNode pNode11 = new BinaryTreeNode(11);

        pNode8.connectTreeNodes(pNode6, pNode10);
        pNode6.connectTreeNodes(pNode5, pNode7);
        pNode10.connectTreeNodes(pNode9, pNode11);

        Test("Test1",pNode8);
        pNode8 = null;
    }

    // 测试二叉树:出叶子结点之外,左右的结点都有且只有一个左子结点
//            8
//          7
//        6
//      5
//    4
    public static void Test2() {
        System.out.println("\n=====Test2 starts:=====");
        BinaryTreeNode pNode8 = new BinaryTreeNode(8);
        BinaryTreeNode pNode7 = new BinaryTreeNode(7);
        BinaryTreeNode pNode6 = new BinaryTreeNode(6);
        BinaryTreeNode pNode5 = new BinaryTreeNode(5);
        BinaryTreeNode pNode4 = new BinaryTreeNode(4);

        pNode8.connectTreeNodes(pNode7, null);
        pNode7.connectTreeNodes(pNode6, null);
        pNode6.connectTreeNodes(pNode5, null);
        pNode5.connectTreeNodes(pNode4, null);

        Test("Test2",pNode8);
        pNode8 = null;
    }

    // 测试二叉树:出叶子结点之外,左右的结点都有且只有一个右子结点
//            8
//             7
//              6
//               5
//                4
    public static void Test3() {
        System.out.println("\n=====Test3 starts:=====");
        BinaryTreeNode pNode8 = new BinaryTreeNode(8);
        BinaryTreeNode pNode7 = new BinaryTreeNode(7);
        BinaryTreeNode pNode6 = new BinaryTreeNode(6);
        BinaryTreeNode pNode5 = new BinaryTreeNode(5);
        BinaryTreeNode pNode4 = new BinaryTreeNode(4);

        pNode8.connectTreeNodes(null, pNode7);
        pNode7.connectTreeNodes(null, pNode6);
        pNode6.connectTreeNodes(null, pNode5);
        pNode5.connectTreeNodes(null, pNode4);

        Test("Test3",pNode8);
        pNode8 = null;
    }

    // 测试空二叉树:根结点为空指针
    public static void Test4() {
        System.out.println("\n=====Test4 starts:=====");
        BinaryTreeNode pNode = null;

        Test("Test4",pNode);
    }

    // 测试只有一个结点的二叉树
    public static void Test5() {
        System.out.println("\n=====Test5 starts:=====");
        BinaryTreeNode pNode8 = new BinaryTreeNode(8);

        Test("Test5",pNode8);
        pNode8 = null;
    }

    public static void main(String[] args) {
        Test1();
        Test2();
        Test3();
        Test4();
        Test5();
    }
}
 
输出结果:
=====Test1 starts:=====
previous printing tree is:
8 6 5 7 10 9 11
middle printing tree is:
5 6 7 8 9 10 11
=====Test1: MirrorRecursively=====
previous printing tree is:
8 10 11 9 6 7 5
middle printing tree is:
11 10 9 8 7 6 5
=====Test1: MirrorIteratively=====
previous printing tree is:
8 6 5 7 10 9 11
middle printing tree is:
5 6 7 8 9 10 11
 
=====Test2 starts:=====
previous printing tree is:
8 7 6 5 4
middle printing tree is:
4 5 6 7 8
=====Test2: MirrorRecursively=====
previous printing tree is:
8 7 6 5 4
middle printing tree is:
8 7 6 5 4
=====Test2: MirrorIteratively=====
previous printing tree is:
8 7 6 5 4
middle printing tree is:
4 5 6 7 8
 
=====Test3 starts:=====
previous printing tree is:
8 7 6 5 4
middle printing tree is:
8 7 6 5 4
=====Test3: MirrorRecursively=====
previous printing tree is:
8 7 6 5 4
middle printing tree is:
4 5 6 7 8
=====Test3: MirrorIteratively=====
previous printing tree is:
8 7 6 5 4
middle printing tree is:
8 7 6 5 4
 
=====Test4 starts:=====
previous printing tree is:
 
middle printing tree is:
 
=====Test4: MirrorRecursively=====
previous printing tree is:
 
middle printing tree is:
 
=====Test4: MirrorIteratively=====
previous printing tree is:
 
middle printing tree is:
 
 
=====Test5 starts:=====
previous printing tree is:
8
middle printing tree is:
8
=====Test5: MirrorRecursively=====
previous printing tree is:
 
middle printing tree is:
 
=====Test5: MirrorIteratively=====
previous printing tree is:
 
middle printing tree is:

 

posted @ 2015-11-04 10:59  我是一名老菜鸟  阅读(269)  评论(0编辑  收藏  举报