• 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() + "	");
            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() + "	");
                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("
    ====="+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("
    ====="+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("
    =====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("
    =====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("
    =====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("
    =====Test4 starts:=====");
            BinaryTreeNode pNode = null;
    
            Test("Test4",pNode);
        }
    
        // 测试只有一个结点的二叉树
        public static void Test5() {
            System.out.println("
    =====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:
  • 相关阅读:
    如何使用Win32API绘制树
    MSD_radix_sort
    Radix Sort
    Computer Science: the Big Picture
    天问之Linux内核中的不明白的地方
    viewController备注
    loadView、viewDidLoad及viewDidUnload的关系(转)
    iOS 中的视图函数 init initwithnib viewDidLoad viewWillAppear的总结
    做ios工程时,把UI从xib移动到代码中遇到的问题
    嘟嘟三期的所学所想
  • 原文地址:https://www.cnblogs.com/yangyquin/p/4935325.html
Copyright © 2020-2023  润新知