思路:利用遞歸判斷左右子樹的深度是否相差1來判斷是否是平衡二叉樹。
1 #include<stdio.h>
2 #include "stdafx.h"
3
4 struct BinaryTreeNode
5 {
6 int m_nValue;
7 BinaryTreeNode* m_pLeft;
8 BinaryTreeNode* m_pRight;
9 };
10
11 BinaryTreeNode* CreateBinaryTreeNode(int value)
12 {
13 BinaryTreeNode* pNode = new BinaryTreeNode();
14 pNode->m_nValue = value;
15 pNode->m_pLeft = NULL;
16 pNode->m_pRight = NULL;
17 }
18
19 void ConnectTreeNodes(BinaryTreeNode* pParent, BinaryTreeNode* pLeft, BinaryTreeNode* pRight)
20 {
21 if(pParent != NULL)
22 {
23 pParent->m_pLeft = pLeft;
24 pParent->m_pRight = pRight;
25 }
26 }
27
28 void PrintTreeNode(BinaryTreeNode* pNode)
29 {
30 if(pNode != NULL)
31 {
32 printf("value of this node is: %d\n", pNode->m_nValue);
33
34 if(pNode->m_pLeft != NULL)
35 printf("value of its left child is: %d.\n", pNode->m_pLeft->m_nValue);
36 else
37 printf("left child is null.\n");
38
39 if(pNode->m_pRight != NULL)
40 printf("value of its right child is: %d.\n",pNode->m_pRight->m_nValue);
41 else
42 printf("right child is null.\n");
43 }
44 else
45 {
46 printf("this node is null.\n");
47 }
48 printf("\n");
49 }
50
51 void PrintTree(BinaryTreeNode* pRoot)
52 {
53 PrintTreeNode(pRoot);
54
55 if(pRoot != NULL)
56 {
57 if(pRoot->m_pLeft != NULL)
58 PrintTree(pRoot->m_pLeft);
59
60 if(pRoot->m_pRight != NULL)
61 PrintTree(pRoot->m_pRight);
62 }
63 }
64
65 void DestroyTree(BinaryTreeNode* pRoot)
66 {
67 if(pRoot != NULL)
68 {
69 BinaryTreeNode* pLeft = pRoot->m_pLeft;
70 BinaryTreeNode* pRight = pRoot->m_pRight;
71
72 delete pRoot;
73 pRoot = NULL;
74
75 DestroyTree(pLeft);
76 DestroyTree(pRight);
77 }
78 }
79
80
81 //========================方法1==============================
82 int TreeDepth(BinaryTreeNode* pRoot)
83 {
84 if(pRoot == NULL)
85 return 0;
86
87 int nLeft = TreeDepth(pRoot->m_pLeft);
88 int nRight = TreeDepth(pRoot->m_pRight);
89
90 return (nLeft > nRight) ? (nLeft + 1) : (nRight + 1);
91 }
92
93 bool IsBalanced_Solution1(BinaryTreeNode* pRoot)
94 {
95 if(pRoot == NULL)
96 return true;
97
98 int left = TreeDepth(pRoot->m_pLeft);
99 int right = TreeDepth(pRoot->m_pRight);
100 int diff = left - right;
101 if(diff > 1 || diff < -1)
102 return false;
103
104 return IsBalanced_Solution1(pRoot->m_pLeft)
105 && IsBalanced_Solution1(pRoot->m_pRight);
106 }
107
108 //=====================方法2===========================
109 bool IsBalanced(BinaryTreeNode* pRoot, int* pDepth);
110
111 bool IsBalanced_Solution2(BinaryTreeNode* pRoot)
112 {
113 int depth = 0;
114 return IsBalanced(pRoot, &depth);
115 }
116
117 bool IsBalanced(BinaryTreeNode* pRoot, int* pDepth)
118 {
119 if(pRoot == NULL)
120 {
121 *pDepth = 0;
122 return true;
123 }
124
125 int left, right;
126 if(IsBalanced(pRoot->m_pLeft, &left)
127 && IsBalanced(pRoot->m_pRight, &right))
128 {
129 int diff = left - right;
130 if(diff <= 1 && diff >= -1)
131 {
132 *pDepth = 1+ (left > right ? left : right);
133 return true;
134 }
135 }
136
137 return false;
138 }
139
140 // 不是完全二叉樹,但是平衡二叉樹
141 // 1
142 // / \
143 // 2 3
144 // /\ \
145 // 4 5 6
146 // /
147 // 7
148
149 int main()
150 {
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 BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7);
158
159 ConnectTreeNodes(pNode1, pNode2, pNode3);
160 ConnectTreeNodes(pNode2, pNode4, pNode5);
161 ConnectTreeNodes(pNode3, pNode6, pNode7);
162
163 printf("Solution1 begins: ");
164 if(IsBalanced_Solution1(pNode1))
165 printf("is balanced.\n");
166 else
167 printf("not balanced.\n");
168
169 printf("Solution2 begins: ");
170 if(IsBalanced_Solution2(pNode1))
171 printf("is balanced.\n");
172 else
173 printf("not balanced.\n");
174 printf("\n");
175
176 DestroyTree(pNode1);
177
178 return 0;
179 }
180
