JZ-C-39-Plus

剑指offer第三十九题-拓展:输入一棵二叉树的根结点,判断该树是不是平衡二叉树(AVL)

  1 //============================================================================
  2 // Name        : JZ-C-39-Plus.cpp
  3 // Author      : Laughing_Lz
  4 // Version     :
  5 // Copyright   : All Right Reserved
  6 // Description : 39-拓展:输入一棵二叉树的根结点,判断该树是不是平衡二叉树(AVL)
  7 //============================================================================
  8 
  9 #include <iostream>
 10 #include <stdio.h>
 11 #include "BinaryTree.h"
 12 using namespace std;
 13 
 14 // ====================方法1====================
 15 /**
 16  * 代码简洁,但是由于一个结点会被重复遍历多次,所以效率不高
 17  */
 18 int TreeDepth(BinaryTreeNode* pRoot) {
 19     if (pRoot == NULL)
 20         return 0;
 21 
 22     int nLeft = TreeDepth(pRoot->m_pLeft);
 23     int nRight = TreeDepth(pRoot->m_pRight);
 24 
 25     return (nLeft > nRight) ? (nLeft + 1) : (nRight + 1);
 26 }
 27 
 28 bool IsBalanced_Solution1(BinaryTreeNode* pRoot) {
 29     if (pRoot == NULL)
 30         return true;
 31 
 32     int left = TreeDepth(pRoot->m_pLeft);
 33     int right = TreeDepth(pRoot->m_pRight);
 34     int diff = left - right;
 35     if (diff > 1 || diff < -1)
 36         return false;
 37 
 38     return IsBalanced_Solution1(pRoot->m_pLeft)
 39             && IsBalanced_Solution1(pRoot->m_pRight);
 40 }
 41 
 42 // ====================方法2====================
 43 /**
 44  * 采用后序遍历★方式遍历二叉树的每一个结点,在遍历到一个结点之前就已经遍历了它的左右子树。
 45  * 一边遍历一边判断每个结点是不是平衡的
 46  */
 47 bool IsBalanced(BinaryTreeNode* pRoot, int* pDepth);
 48 
 49 bool IsBalanced_Solution2(BinaryTreeNode* pRoot) {
 50     int depth = 0;
 51     return IsBalanced(pRoot, &depth);
 52 }
 53 
 54 bool IsBalanced(BinaryTreeNode* pRoot, int* pDepth) {
 55     if (pRoot == NULL) {
 56         *pDepth = 0;
 57         return true;
 58     }
 59 
 60     int left, right;
 61     if (IsBalanced(pRoot->m_pLeft, &left)
 62             && IsBalanced(pRoot->m_pRight, &right)) {
 63         int diff = left - right;
 64         if (diff <= 1 && diff >= -1) {
 65             *pDepth = 1 + (left > right ? left : right);
 66             return true;
 67         }
 68     }
 69 
 70     return false;
 71 }
 72 
 73 // ====================测试代码====================
 74 void Test(char* testName, BinaryTreeNode* pRoot, bool expected) {
 75     if (testName != NULL)
 76         printf("%s begins:\n", testName);
 77 
 78     printf("Solution1 begins: ");
 79     if (IsBalanced_Solution1(pRoot) == expected)
 80         printf("Passed.\n");
 81     else
 82         printf("Failed.\n");
 83 
 84     printf("Solution2 begins: ");
 85     if (IsBalanced_Solution2(pRoot) == expected)
 86         printf("Passed.\n");
 87     else
 88         printf("Failed.\n");
 89 }
 90 
 91 // 完全二叉树
 92 //             1
 93 //         /      \
 94 //        2        3
 95 //       /\       / \
 96 //      4  5     6   7
 97 void Test1() {
 98     BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
 99     BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
100     BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
101     BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
102     BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
103     BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);
104     BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7);
105 
106     ConnectTreeNodes(pNode1, pNode2, pNode3);
107     ConnectTreeNodes(pNode2, pNode4, pNode5);
108     ConnectTreeNodes(pNode3, pNode6, pNode7);
109 
110     Test("Test1", pNode1, true);
111 
112     DestroyTree(pNode1);
113 }
114 
115 // 不是完全二叉树,但是平衡二叉树
116 //             1
117 //         /      \
118 //        2        3
119 //       /\         \
120 //      4  5         6
121 //        /
122 //       7
123 void Test2() {
124     BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
125     BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
126     BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
127     BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
128     BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
129     BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);
130     BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7);
131 
132     ConnectTreeNodes(pNode1, pNode2, pNode3);
133     ConnectTreeNodes(pNode2, pNode4, pNode5);
134     ConnectTreeNodes(pNode3, NULL, pNode6);
135     ConnectTreeNodes(pNode5, pNode7, NULL);
136 
137     Test("Test2", pNode1, true);
138 
139     DestroyTree(pNode1);
140 }
141 
142 // 不是平衡二叉树
143 //             1
144 //         /      \
145 //        2        3
146 //       /\
147 //      4  5
148 //        /
149 //       6
150 void Test3() {
151     BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
152     BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
153     BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
154     BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
155     BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
156     BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);
157 
158     ConnectTreeNodes(pNode1, pNode2, pNode3);
159     ConnectTreeNodes(pNode2, pNode4, pNode5);
160     ConnectTreeNodes(pNode5, pNode6, NULL);
161 
162     Test("Test3", pNode1, false);
163 
164     DestroyTree(pNode1);
165 }
166 
167 //               1
168 //              /
169 //             2
170 //            /
171 //           3
172 //          /
173 //         4
174 //        /
175 //       5
176 void Test4() {
177     BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
178     BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
179     BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
180     BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
181     BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
182 
183     ConnectTreeNodes(pNode1, pNode2, NULL);
184     ConnectTreeNodes(pNode2, pNode3, NULL);
185     ConnectTreeNodes(pNode3, pNode4, NULL);
186     ConnectTreeNodes(pNode4, pNode5, NULL);
187 
188     Test("Test4", pNode1, false);
189 
190     DestroyTree(pNode1);
191 }
192 
193 // 1
194 //  \
195 //   2
196 //    \
197 //     3
198 //      \
199 //       4
200 //        \
201 //         5
202 void Test5() {
203     BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
204     BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
205     BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
206     BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
207     BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
208 
209     ConnectTreeNodes(pNode1, NULL, pNode2);
210     ConnectTreeNodes(pNode2, NULL, pNode3);
211     ConnectTreeNodes(pNode3, NULL, pNode4);
212     ConnectTreeNodes(pNode4, NULL, pNode5);
213 
214     Test("Test5", pNode1, false);
215 
216     DestroyTree(pNode1);
217 }
218 
219 // 树中只有1个结点
220 void Test6() {
221     BinaryTreeNode* pNode1 = CreateBinaryTreeNode(1);
222     Test("Test6", pNode1, true);
223 
224     DestroyTree(pNode1);
225 }
226 
227 // 树中没有结点
228 void Test7() {
229     Test("Test7", NULL, true);
230 }
231 
232 int main(int argc, char** argv) {
233     Test1();
234     Test2();
235     Test3();
236     Test4();
237     Test5();
238     Test6();
239     Test7();
240 
241     return 0;
242 }

 

posted @ 2016-06-22 20:50  回看欧洲  阅读(154)  评论(0编辑  收藏  举报