1 // 面试题8:二叉树的下一个结点
2 // 题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?
3 // 树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针。
4
5 #include <stdio.h>
6
7 struct BinaryTreeNode
8 {
9 int m_nValue;
10 BinaryTreeNode* m_pLeft;
11 BinaryTreeNode* m_pRight;
12 BinaryTreeNode* m_pParent;
13 };
14
15 BinaryTreeNode* GetNext(BinaryTreeNode* pNode)
16 {
17 if(pNode == nullptr)
18 return nullptr;
19
20 BinaryTreeNode* pNext = nullptr;
21 if(pNode->m_pRight != nullptr)
22 {
23 BinaryTreeNode* pRight = pNode->m_pRight;
24 while(pRight->m_pLeft != nullptr)
25 pRight = pRight->m_pLeft;
26
27 pNext = pRight;
28 }
29 else if(pNode->m_pParent != nullptr)
30 {
31 BinaryTreeNode* pCurrent = pNode;
32 BinaryTreeNode* pParent = pNode->m_pParent;
33 while(pParent != nullptr && pCurrent == pParent->m_pRight)
34 {
35 pCurrent = pParent;
36 pParent = pParent->m_pParent;
37 }
38
39 pNext = pParent;
40 }
41
42 return pNext;
43 }
44
45 // ==================== 辅助代码用来构建二叉树 ====================
46 BinaryTreeNode* CreateBinaryTreeNode(int value)
47 {
48 BinaryTreeNode* pNode = new BinaryTreeNode();
49 pNode->m_nValue = value;
50 pNode->m_pLeft = nullptr;
51 pNode->m_pRight = nullptr;
52 pNode->m_pParent = nullptr;
53
54 return pNode;
55 }
56
57 void ConnectTreeNodes(BinaryTreeNode* pParent, BinaryTreeNode* pLeft, BinaryTreeNode* pRight)
58 {
59 if(pParent != nullptr)
60 {
61 pParent->m_pLeft = pLeft;
62 pParent->m_pRight = pRight;
63
64 if(pLeft != nullptr)
65 pLeft->m_pParent = pParent;
66 if(pRight != nullptr)
67 pRight->m_pParent = pParent;
68 }
69 }
70
71 void PrintTreeNode(BinaryTreeNode* pNode)
72 {
73 if(pNode != nullptr)
74 {
75 printf("value of this node is: %d
", pNode->m_nValue);
76
77 if(pNode->m_pLeft != nullptr)
78 printf("value of its left child is: %d.
", pNode->m_pLeft->m_nValue);
79 else
80 printf("left child is null.
");
81
82 if(pNode->m_pRight != nullptr)
83 printf("value of its right child is: %d.
", pNode->m_pRight->m_nValue);
84 else
85 printf("right child is null.
");
86 }
87 else
88 {
89 printf("this node is null.
");
90 }
91
92 printf("
");
93 }
94
95 void PrintTree(BinaryTreeNode* pRoot)
96 {
97 PrintTreeNode(pRoot);
98
99 if(pRoot != nullptr)
100 {
101 if(pRoot->m_pLeft != nullptr)
102 PrintTree(pRoot->m_pLeft);
103
104 if(pRoot->m_pRight != nullptr)
105 PrintTree(pRoot->m_pRight);
106 }
107 }
108
109 void DestroyTree(BinaryTreeNode* pRoot)
110 {
111 if(pRoot != nullptr)
112 {
113 BinaryTreeNode* pLeft = pRoot->m_pLeft;
114 BinaryTreeNode* pRight = pRoot->m_pRight;
115
116 delete pRoot;
117 pRoot = nullptr;
118
119 DestroyTree(pLeft);
120 DestroyTree(pRight);
121 }
122 }
123
124 // ====================测试代码====================
125 void Test(char* testName, BinaryTreeNode* pNode, BinaryTreeNode* expected)
126 {
127 if(testName != nullptr)
128 printf("%s begins: ", testName);
129
130 BinaryTreeNode* pNext = GetNext(pNode);
131 if(pNext == expected)
132 printf("Passed.
");
133 else
134 printf("FAILED.
");
135 }
136
137 // 8
138 // 6 10
139 // 5 7 9 11
140 void Test1_7()
141 {
142 BinaryTreeNode* pNode8 = CreateBinaryTreeNode(8);
143 BinaryTreeNode* pNode6 = CreateBinaryTreeNode(6);
144 BinaryTreeNode* pNode10 = CreateBinaryTreeNode(10);
145 BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
146 BinaryTreeNode* pNode7 = CreateBinaryTreeNode(7);
147 BinaryTreeNode* pNode9 = CreateBinaryTreeNode(9);
148 BinaryTreeNode* pNode11 = CreateBinaryTreeNode(11);
149
150 ConnectTreeNodes(pNode8, pNode6, pNode10);
151 ConnectTreeNodes(pNode6, pNode5, pNode7);
152 ConnectTreeNodes(pNode10, pNode9, pNode11);
153
154 Test("Test1", pNode8, pNode9);
155 Test("Test2", pNode6, pNode7);
156 Test("Test3", pNode10, pNode11);
157 Test("Test4", pNode5, pNode6);
158 Test("Test5", pNode7, pNode8);
159 Test("Test6", pNode9, pNode10);
160 Test("Test7", pNode11, nullptr);
161
162 DestroyTree(pNode8);
163 }
164
165 // 5
166 // 4
167 // 3
168 // 2
169 void Test8_11()
170 {
171 BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
172 BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
173 BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
174 BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
175
176 ConnectTreeNodes(pNode5, pNode4, nullptr);
177 ConnectTreeNodes(pNode4, pNode3, nullptr);
178 ConnectTreeNodes(pNode3, pNode2, nullptr);
179
180 Test("Test8", pNode5, nullptr);
181 Test("Test9", pNode4, pNode5);
182 Test("Test10", pNode3, pNode4);
183 Test("Test11", pNode2, pNode3);
184
185 DestroyTree(pNode5);
186 }
187
188 // 2
189 // 3
190 // 4
191 // 5
192 void Test12_15()
193 {
194 BinaryTreeNode* pNode2 = CreateBinaryTreeNode(2);
195 BinaryTreeNode* pNode3 = CreateBinaryTreeNode(3);
196 BinaryTreeNode* pNode4 = CreateBinaryTreeNode(4);
197 BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
198
199 ConnectTreeNodes(pNode2, nullptr, pNode3);
200 ConnectTreeNodes(pNode3, nullptr, pNode4);
201 ConnectTreeNodes(pNode4, nullptr, pNode5);
202
203 Test("Test12", pNode5, nullptr);
204 Test("Test13", pNode4, pNode5);
205 Test("Test14", pNode3, pNode4);
206 Test("Test15", pNode2, pNode3);
207
208 DestroyTree(pNode2);
209 }
210
211 void Test16()
212 {
213 BinaryTreeNode* pNode5 = CreateBinaryTreeNode(5);
214
215 Test("Test16", pNode5, nullptr);
216
217 DestroyTree(pNode5);
218 }
219
220 int main(int argc, char* argv[])
221 {
222 Test1_7();
223 Test8_11();
224 Test12_15();
225 Test16();
226 }