JZ-C-19

剑指offer第十九题:二叉树的镜像

  1 //============================================================================
  2 // Name        : JZ-C-19.cpp
  3 // Author      : Laughing_Lz
  4 // Version     :
  5 // Copyright   : All Right Reserved
  6 // Description : 二叉树的镜像
  7 //============================================================================
  8 
  9 #include <iostream>
 10 #include <stdio.h>
 11 #include <stack>
 12 #include "BinaryTree.h"
 13 using namespace std;
 14 /**
 15  *前序遍历:递归
 16  */
 17 void MirrorRecursively(BinaryTreeNode* root) {
 18     if (root == NULL) {
 19         return;
 20     }
 21     if (root->m_pLeft == NULL && root->m_pRight == NULL) { //这里是&&
 22         return;
 23     }
 24     BinaryTreeNode* temp = root->m_pLeft;
 25     ; //临时结点,用于交换左右子孩子
 26     root->m_pLeft = root->m_pRight;
 27     root->m_pRight = temp;
 28     if (root->m_pLeft != NULL) {
 29         MirrorRecursively(root->m_pLeft);
 30     }
 31     if (root->m_pRight != NULL) {
 32         MirrorRecursively(root->m_pRight);
 33     }
 34 }
 35 /**
 36  *前序遍历:循环
 37  */
 38 void MirrorIteratively(BinaryTreeNode *root) {
 39     if (root == NULL) {
 40         return;
 41     }
 42     std::stack<BinaryTreeNode*> stackTreeNode; //利用栈的出入来存储每次需要遍历的结点
 43     stackTreeNode.push(root);
 44 
 45     while (stackTreeNode.size() > 0) {
 46         BinaryTreeNode *Node = stackTreeNode.top(); //拿到要操作的结点
 47         stackTreeNode.pop(); //出栈
 48 
 49         BinaryTreeNode *temp = Node->m_pLeft;
 50         Node->m_pLeft = Node->m_pRight;
 51         Node->m_pRight = temp;
 52 
 53         if (Node->m_pLeft != NULL) {
 54             stackTreeNode.push(Node->m_pLeft);
 55         }
 56         if (Node->m_pRight != NULL) {
 57             stackTreeNode.push(Node->m_pRight);
 58         }
 59     }
 60 }
 61 // ====================测试代码====================
 62 // 测试完全二叉树:除了叶子节点,其他节点都有两个子节点
 63 //            8
 64 //        6      10
 65 //       5 7    9  11
 66 void Test1() {
 67     printf("=====Test1 starts:=====
");
 68     BinaryTreeNode* pNode8 = CreateBinaryTreeNode(8);
 69     BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);
 70     BinaryTreeNode* pNode10 = CreateBinaryTreeNode(10);
 71     BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
 72     BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7);
 73     BinaryTreeNode* pNode9 = CreateBinaryTreeNode(9);
 74     BinaryTreeNode* pNode11 = CreateBinaryTreeNode(11);
 75 
 76     ConnectTreeNodes(pNode8, pNode6, pNode10);
 77     ConnectTreeNodes(pNode6, pNode5, pNode7);
 78     ConnectTreeNodes(pNode10, pNode9, pNode11);
 79 
 80     PrintTree(pNode8);
 81 
 82     printf("=====Test1: MirrorRecursively=====
");
 83     MirrorRecursively(pNode8);
 84     PrintTree(pNode8);
 85 
 86     printf("=====Test1: MirrorIteratively=====
");
 87     MirrorIteratively(pNode8);
 88     PrintTree(pNode8);
 89 
 90     DestroyTree(pNode8);
 91 }
 92 
 93 // 测试二叉树:出叶子结点之外,左右的结点都有且只有一个左子结点
 94 //            8
 95 //          7
 96 //        6
 97 //      5
 98 //    4
 99 void Test2() {
100     printf("=====Test2 starts:=====
");
101     BinaryTreeNode* pNode8 = CreateBinaryTreeNode(8);
102     BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7);
103     BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);
104     BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
105     BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
106 
107     ConnectTreeNodes(pNode8, pNode7, NULL);
108     ConnectTreeNodes(pNode7, pNode6, NULL);
109     ConnectTreeNodes(pNode6, pNode5, NULL);
110     ConnectTreeNodes(pNode5, pNode4, NULL);
111 
112     PrintTree(pNode8);
113 
114     printf("=====Test2: MirrorRecursively=====
");
115     MirrorRecursively(pNode8);
116     PrintTree(pNode8);
117 
118     printf("=====Test2: MirrorIteratively=====
");
119     MirrorIteratively(pNode8);
120     PrintTree(pNode8);
121 
122     DestroyTree(pNode8);
123 }
124 
125 // 测试二叉树:出叶子结点之外,左右的结点都有且只有一个右子结点
126 //            8
127 //             7
128 //              6
129 //               5
130 //                4
131 void Test3() {
132     printf("=====Test3 starts:=====
");
133     BinaryTreeNode* pNode8 = CreateBinaryTreeNode(8);
134     BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7);
135     BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);
136     BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
137     BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
138 
139     ConnectTreeNodes(pNode8, NULL, pNode7);
140     ConnectTreeNodes(pNode7, NULL, pNode6);
141     ConnectTreeNodes(pNode6, NULL, pNode5);
142     ConnectTreeNodes(pNode5, NULL, pNode4);
143 
144     PrintTree(pNode8);
145 
146     printf("=====Test3: MirrorRecursively=====
");
147     MirrorRecursively(pNode8);
148     PrintTree(pNode8);
149 
150     printf("=====Test3: MirrorIteratively=====
");
151     MirrorIteratively(pNode8);
152     PrintTree(pNode8);
153 
154     DestroyTree(pNode8);
155 }
156 
157 // 测试空二叉树:根结点为空指针
158 void Test4() {
159     printf("=====Test4 starts:=====
");
160     BinaryTreeNode* pNode = NULL;
161 
162     PrintTree(pNode);
163 
164     printf("=====Test4: MirrorRecursively=====
");
165     MirrorRecursively(pNode);
166     PrintTree(pNode);
167 
168     printf("=====Test4: MirrorIteratively=====
");
169     MirrorIteratively(pNode);
170     PrintTree(pNode);
171 }
172 
173 // 测试只有一个结点的二叉树
174 void Test5() {
175     printf("=====Test5 starts:=====
");
176     BinaryTreeNode* pNode8 = CreateBinaryTreeNode(8);
177 
178     PrintTree(pNode8);
179 
180     printf("=====Test4: MirrorRecursively=====
");
181     MirrorRecursively(pNode8);
182     PrintTree(pNode8);
183 
184     printf("=====Test4: MirrorIteratively=====
");
185     MirrorIteratively(pNode8);
186     PrintTree(pNode8);
187 }
188 
189 int main(int argc, char** argv) {
190     Test1();
191     Test2();
192     Test3();
193     Test4();
194     Test5();
195 
196     return 0;
197 }
原文地址:https://www.cnblogs.com/Laughing-Lz/p/5577593.html