为了面试,看了何海涛的《剑指Offer》19题求求普通二叉树的镜像,决定通过自己的理解实现之,话不多说,立刻贴源码
//下面是 TreeOperate 类的实现
1 #include "BinTree.h" 2 #include <iostream> 3 #include <cstdlib> 4 //This function is to be used to construct a binary tree 5 void TreeOperate::connect(BinaryTreeNode *pRoot, BinaryTreeNode *pLeft, BinaryTreeNode *pRight){ 6 if (pRoot == NULL) 7 abort(); 8 pRoot->m_pLeft = pLeft; 9 pRoot->m_pRight = pRight; 10 } 11 //This function is to be used to destroy a tree and recycle space the tree used 12 void TreeOperate::destroy(BinaryTreeNode *&pRoot){ 13 if (pRoot == NULL) return; 14 destroy(pRoot->m_pLeft); 15 destroy(pRoot->m_pRight); 16 delete pRoot; 17 18 } 19 //This function is to used to print the tree nodes in the preorder 20 void TreeOperate::prePrint(BinaryTreeNode *pRoot){ 21 if (pRoot == NULL) return; 22 printf("%d\n", pRoot->m_nValue); 23 24 prePrint(pRoot->m_pLeft); 25 prePrint(pRoot->m_pRight); 26 27 } 28 //This function is ultimate. It is used to return the root whose subtrees have been swapped if necessary. 29 BinaryTreeNode *TreeOperate::mirrorTree(BinaryTreeNode *pRoot){ 30 //pRoot == NULL ,which is a bad case bringing about serious problems.We have to avoid it. 31 if (pRoot == NULL) abort(); 32 //The root has no subtree so there is no need to do anything. 33 if (pRoot->m_pLeft == NULL && pRoot->m_pRight == NULL){ 34 return pRoot; 35 }else{ 36 // The right subtree is not null.Set the left subtree to be the mirror tree of the right subtree. 37 if (pRoot->m_pLeft == NULL){ 38 pRoot->m_pLeft = mirrorTree(pRoot->m_pRight); 39 pRoot->m_pRight = NULL; 40 return pRoot; 41 } 42 // The left subtree is not null.Set the right subtree to be the mirror tree of the left subtree. 43 if (pRoot->m_pRight == NULL){ 44 pRoot->m_pRight = mirrorTree(pRoot->m_pLeft); 45 pRoot->m_pLeft = NULL; 46 return pRoot; 47 } 48 /* 49 *Get the mirrorTrees of subtrees ,and then swap the subtrees.In this case,both of the subtrees are not null. 50 */ 51 //The temporary variable is used to store the value of the root of the left subtree.The primary goal is for swapping. 52 BinaryTreeNode *pTempNode = mirrorTree(pRoot->m_pLeft); 53 pRoot->m_pLeft = mirrorTree(pRoot->m_pRight); 54 pRoot->m_pRight = pTempNode; 55 return pRoot; 56 } 57 }
//下面是测试代码,为简单起见 nodeX 的m_nValue 就是 X
#include <iostream>
#include "BinTree.h"
using namespace std;
int main(){
//Nodes shouldn't have the same space
BinaryTreeNode *node1 = new BinaryTreeNode;
node1->m_nValue = 1;
node1->m_pLeft = NULL;
node1->m_pRight = NULL;
BinaryTreeNode *node2 = new BinaryTreeNode;
node2->m_nValue = 2;
node2->m_pLeft = NULL;
node2->m_pRight = NULL;
BinaryTreeNode *node3 = new BinaryTreeNode;
node3->m_nValue = 3;
node3->m_pLeft = NULL;
node3->m_pRight = NULL;
BinaryTreeNode *node4 = new BinaryTreeNode;
node4->m_nValue = 4;
node4->m_pLeft = NULL;
node4->m_pRight = NULL;
BinaryTreeNode *node5 = new BinaryTreeNode;
node5->m_nValue = 5;
node5->m_pLeft = NULL;
node5->m_pRight = NULL;
BinaryTreeNode *node6 = new BinaryTreeNode;
node6->m_nValue = 6;
node6->m_pLeft = NULL;
node6->m_pRight = NULL;
BinaryTreeNode *node7 = new BinaryTreeNode;
node7->m_nValue = 7;
node7->m_pLeft = NULL;
node7->m_pRight = NULL;
// All nodes have different memory space.You'd better be sure that nodeX != nodeY before using them.
/*
* Connect the node you need to build a tree. The first parameter is the root.The second is the left child of the root.The
third is the right child of the root.
*/
TreeOperate::connect(node1, node2, node3);
TreeOperate::connect(node2, node4, node5);
TreeOperate::connect(node3, node6, node7);
//print the tree nodes in the preorder
TreeOperate::prePrint(node1);
cout << "***********" << endl;
//mirrorTree
BinaryTreeNode *pTemp = TreeOperate::mirrorTree(node1);
TreeOperate::prePrint(node1);
TreeOperate::destroy(node1);
node1 = node2 = node3 = node4 = node5 = node6 = node7 = NULL;
system("pause");
}
//下面是头文件的书写,一起贴上吧
1 #ifndef BINTREE_H 2 #define BINTREE_H 3 struct BinaryTreeNode{ 4 int m_nValue; 5 BinaryTreeNode* m_pLeft; 6 BinaryTreeNode* m_pRight; 7 }; 8 class TreeOperate{ 9 public: 10 11 static void connect(BinaryTreeNode *, BinaryTreeNode *, BinaryTreeNode *); 12 static void destroy(BinaryTreeNode *&); 13 static void prePrint(BinaryTreeNode *); 14 static BinaryTreeNode *mirrorTree(BinaryTreeNode *); 15 }; 16 #endif
总结:递归函数的情况讨论详细和函数头的设计是至关重要的
欢迎去海涛哥的博客去看看 http://zhedahht.blog.163.com/
浙公网安备 33010602011771号