/*******************************************************************
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;
}