/
//1. 题目19 二叉树的镜像
// 请完成一个函数,输入一个二叉树,该函数输出它的镜像
// 时间复杂度:O(n), 空间复杂度:O(1) --> 但是递归有一些函数形参等的消耗
void MirrorOfBinaryTree(BinarySeachTreeNode<int>* pRoot) { if (NULL == pRoot || (NULL == pRoot->m_pLeftNode && NULL == pRoot->m_pRightNode)) { return; } // 交换左右节点 BinarySeachTreeNode<int>* pTmpNode = pRoot->m_pLeftNode; pRoot->m_pLeftNode = pRoot->m_pRightNode; pRoot->m_pRightNode = pTmpNode; if (pRoot->m_pLeftNode) { MirrorOfBinaryTree(pRoot->m_pLeftNode); } if (pRoot->m_pRightNode) { MirrorOfBinaryTree(pRoot->m_pRightNode); } } // 二叉树镜像:非递归 // 时间复杂度:O(n), 空间复杂度:O(n) void MirrorOfBinaryTree_1(BinarySeachTreeNode<int>* pRoot) { if (NULL == pRoot || (NULL == pRoot->m_pLeftNode && NULL == pRoot->m_pRightNode)) { return; } queue<BinarySeachTreeNode<int>*> stQueue; stQueue.push(pRoot); // 队列先进先出 while (!stQueue.empty()) { pRoot = stQueue.front(); stQueue.pop(); // 交换子节点 BinarySeachTreeNode<int>* pTmpNode = pRoot->m_pLeftNode; pRoot->m_pLeftNode = pRoot->m_pRightNode; pRoot->m_pRightNode = pTmpNode; if (pRoot->m_pLeftNode) { stQueue.push(pRoot->m_pLeftNode); } if (pRoot->m_pRightNode) { stQueue.push(pRoot->m_pRightNode); } } } void MirrorOfBinaryTreeTestFunc() { cout << "\n\n --------------- MirrorOfBinaryTreeTestFunc Start -------------->" << endl; int aiArray[] = {8, 6, 10, 5, 7, 9, 11, 12}; int iLen = sizeof(aiArray) / sizeof(int); TRAVERSAL_ARRAY(aiArray, iLen); // 1.建立一个二叉树 CBinarySearchTree<int>* pTree = new CBinarySearchTree<int>(); if (NULL == pTree) { return; } for (int i = 0; i < iLen; i++) { pTree->Insert(aiArray[i]); } pTree->Traversal(); pTree->Traversal(TRAVERSAL_TYPE_RECUR_PRE_ORDER); // 2.二叉树镜像 const BinarySeachTreeNode<int>* pRoot = pTree->GetTreeRootNode(); MirrorOfBinaryTree(const_cast<BinarySeachTreeNode<int>*>(pRoot)); // 去const属性 pTree->Traversal(); MirrorOfBinaryTree_1(const_cast<BinarySeachTreeNode<int>*>(pRoot)); pTree->Traversal(); // 3.释放内存 SAVE_DELETE(pTree); cout << "\n\n --------------- MirrorOfBinaryTreeTestFunc End -------------->" << endl; }