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

/*******************************************************************
Copyright(c) 2016, Tyrone Li
All rights reserved.
*******************************************************************/
// 作者:TyroneLi
//

/*
Q:
    二叉树的镜像:
        实现一个函数,输入一个二叉树,输出它的镜像。
S:
    使用前序遍历的方法依次遍历根结点,同时调换它的左子树和右子树,直至抵达叶子节点。
*/

#include "../utils/BinaryTree.h"
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>

void mirrorBinaryTree(BinaryTreeNode*pRoot)
{
    if(pRoot == nullptr || (pRoot->m_pLeft == nullptr && pRoot->m_pRight == nullptr))
        return;

    BinaryTreeNode*tmp = pRoot->m_pLeft;
    pRoot->m_pLeft = pRoot->m_pRight;
    pRoot->m_pRight = tmp;
    if(pRoot->m_pLeft != nullptr)
        mirrorBinaryTree(pRoot->m_pLeft);
    if(pRoot->m_pRight != nullptr)
        mirrorBinaryTree(pRoot->m_pRight);
}

void test_1()
{
    std::cout << "test 1" << std::endl;
    BinaryTreeNode*p_11 = createBinaryTreeNode(8);
    BinaryTreeNode*p_12 = createBinaryTreeNode(6);
    BinaryTreeNode*p_13 = createBinaryTreeNode(10);
    BinaryTreeNode*p_14 = createBinaryTreeNode(5);
    BinaryTreeNode*p_15 = createBinaryTreeNode(7);
    BinaryTreeNode*p_16 = createBinaryTreeNode(9);
    BinaryTreeNode*p_17 = createBinaryTreeNode(11);
    connectTreeNodes(p_11, p_12, p_13);
    connectTreeNodes(p_12, p_14, p_15);
    connectTreeNodes(p_13, p_16, p_17);
    std::cout << "Print original Tree A pre-order" << std::endl;
    printTreePreOrder(p_11);
    std::cout << std::endl;

    mirrorBinaryTree(p_11);
    std::cout << "Print mirror Tree A pre-order" << std::endl;
    printTreePreOrder(p_11);
    std::cout << std::endl << std::endl;

    destroyTree(p_11);
}

void test_2()
{
    std::cout << "test 2" << std::endl;
    BinaryTreeNode*p_11 = createBinaryTreeNode(8);
    BinaryTreeNode*p_12 = createBinaryTreeNode(6);
    BinaryTreeNode*p_13 = createBinaryTreeNode(5);
    connectTreeNodes(p_11, nullptr, p_12);
    connectTreeNodes(p_12, nullptr, p_13);
    std::cout << "Print original Tree A pre-order" << std::endl;
    printTreePreOrder(p_11);
    std::cout << std::endl;

    mirrorBinaryTree(p_11);
    std::cout << "Print mirror Tree A pre-order" << std::endl;
    printTreePreOrder(p_11);
    std::cout << std::endl << std::endl;

    destroyTree(p_11);
}

void test_3()
{
    std::cout << "test 3" << std::endl;
    BinaryTreeNode*p_11 = createBinaryTreeNode(8);
    std::cout << "Print original Tree A pre-order" << std::endl;
    printTreePreOrder(p_11);
    std::cout << std::endl;

    mirrorBinaryTree(p_11);
    std::cout << "Print mirror Tree A pre-order" << std::endl;
    printTreePreOrder(p_11);
    std::cout << std::endl << std::endl;

    destroyTree(p_11);
}

void test_4()
{
    std::cout << "test 4" << std::endl;
    BinaryTreeNode*p_11 = nullptr;
    std::cout << "Print original Tree A pre-order" << std::endl;
    printTreePreOrder(p_11);
    std::cout << std::endl;

    mirrorBinaryTree(p_11);
    std::cout << "Print mirror Tree A pre-order" << std::endl;
    printTreePreOrder(p_11);
    std::cout << std::endl << std::endl;

    destroyTree(p_11);
}

void test_mirrorBinaryTree()
{
    test_1();
    test_2();
    test_3();
    test_4();
}

int main(int argc, char**argv)
{

    test_mirrorBinaryTree();

    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值