二叉树的镜像变换


 1 #include "stdafx.h"  
 2 #include <iostream>  
 3 using namespace std;  
 4   
 5 struct BinaryTreeNode  
 6 {  
 7     int m_nValue;  
 8     BinaryTreeNode *m_pLeft;  
 9     BinaryTreeNode *m_pRight;  
10 };  
11   
12 //构造树的镜像  
13 void Mirror(BinaryTreeNode *pRoot)  
14 {  
15    if (pRoot != NULL)  
16    {  
17        BinaryTreeNode *pTemp = NULL;  
18        if (pRoot->m_pLeft != NULL || pRoot->m_pRight != NULL)  
19        {  
20            pTemp = pRoot->m_pLeft;  
21            pRoot->m_pLeft = pRoot->m_pRight;  
22            pRoot->m_pRight = pTemp;  
23        }  
24   
25        if (pRoot->m_pLeft != NULL)  
26        {  
27            Mirror(pRoot->m_pLeft);  
28        }  
29   
30        if (pRoot->m_pRight != NULL)  
31        {  
32            Mirror(pRoot->m_pRight);  
33        }  
34    }  
35 }  
36   
37 //以先序的方式构建二叉树,输入-1表示结点为空  
38 void CreateBinaryTree(BinaryTreeNode *&pRoot)  
39 {  
40     int nNodeValue = 0;  
41     cin >> nNodeValue;      
42     if (-1 == nNodeValue)  
43     {  
44         return;   
45     }  
46     else  
47     {  
48         pRoot = new BinaryTreeNode();  
49         pRoot->m_nValue = nNodeValue;  
50         CreateBinaryTree(pRoot->m_pLeft);  
51         CreateBinaryTree(pRoot->m_pRight);  
52     }  
53 }  
54   
55 void PrintInOrder(BinaryTreeNode *&pRoot)  
56 {  
57     if (pRoot != NULL)  
58     {  
59         PrintInOrder(pRoot->m_pLeft);  
60         cout << pRoot->m_nValue << " ";  
61         PrintInOrder(pRoot->m_pRight);  
62     }  
63 }  
64   
65 int _tmain(int argc, _TCHAR* argv[])  
66 {  
67     BinaryTreeNode *pRoot = NULL;  
68     CreateBinaryTree(pRoot);  
69     PrintInOrder(pRoot);  
70     cout << endl;  
71       
72     Mirror(pRoot);  
73     PrintInOrder(pRoot);  
74     cout << endl;  
75   
76     system("pause");  
77     return 0;  
78 }  

 

  
1
//二叉树的镜像变换 2 #include <iostream> 3 #include <stack> 4 using namespace std; 5 6 //二叉树结构 7 struct BTreeNode 8 { 9 int m_nValue; 10 BTreeNode *m_pLeft; 11 BTreeNode *m_pRight; 12 }; 13 14 //递归实现 15 void MirrorRecursively(BTreeNode *pNode) 16 { 17 if(!pNode) 18 { 19 return; 20 } 21 //交换左右孩子 22 BTreeNode *pTemp = pNode->m_pLeft; 23 pNode->m_pLeft = pNode->m_pRight; 24 pNode->m_pRight = pTemp; 25 26 if(pNode->m_pLeft) 27 { 28 MirrorRecursively(pNode->m_pLeft); 29 } 30 31 if(pNode->m_pRight) 32 { 33 MirrorRecursively(pNode->m_pRight); 34 } 35 } 36 37 void MirrorIteratively(BTreeNode *pNode) 38 { 39 if(!pNode) 40 { 41 return ; 42 } 43 44 stack<BTreeNode *> stackTreeNode; 45 stackTreeNode.push(pNode); 46 47 while(stackTreeNode.size()) 48 { 49 BTreeNode *pNode = stackTreeNode.top(); 50 stackTreeNode.pop(); 51 52 //交换左右孩子 53 BTreeNode *pTemp = pNode->m_pLeft; 54 pNode->m_pLeft = pNode->m_pRight; 55 pNode->m_pRight = pTemp; 56 57 if(pNode->m_pLeft) 58 { 59 stackTreeNode.push(pNode->m_pLeft); 60 } 61 if(pNode->m_pRight) 62 { 63 stackTreeNode.push(pNode->m_pRight); 64 } 65 } 66 67 } 68 69 //按照先序创建二叉树,0表示空 70 BTreeNode *Create() 71 { 72 int ch; 73 cin>> ch; 74 if(ch == 0) 75 { 76 return NULL; 77 } 78 else 79 { 80 BTreeNode *root = new BTreeNode(); 81 root->m_nValue = ch; 82 root->m_pLeft = Create(); 83 root->m_pRight = Create(); 84 return root; 85 } 86 } 87 88 //按照先序 打印 树 89 void printBTree(BTreeNode *root) 90 { 91 if(!root) 92 { 93 return ; 94 } 95 cout << root->m_nValue <<" "; 96 printBTree(root->m_pLeft); 97 printBTree(root->m_pRight); 98 } 99 100 void main() 101 { 102 BTreeNode *tree = NULL; 103 cout << "先序创建二叉树:"; 104 tree = Create(); 105 cout << "先序打印二叉树:"; 106 printBTree(tree); 107 108 MirrorRecursively(tree); 109 cout <<endl<<"变换后:"; 110 printBTree(tree); 111 112 cout <<endl<<"再次变换:"; 113 MirrorIteratively(tree); 114 printBTree(tree); 115 cout << endl; 116 }

 

posted on 2013-10-28 19:11  samules  阅读(251)  评论(0编辑  收藏  举报

导航