实验6
学号: 姓名: 专业:
6.1 实验目的
掌握二叉树的动态链表存储结构及表示。
掌握二叉树的三种遍历算法(递归和非递归两类)。
运用二叉树三种遍历的方法求解有关问题。
6.2 实验要求
按照C++面向对象方法编写二叉树类;二叉树的测试数据可用多种方式进行输入,如键盘输入、静态写入、文件读入等。//最难的是从文件把数据读进去!
设计二叉树的二叉链表存储结构,编写算法实现下列问题的求解。
<1>打印出二叉树的三种遍历序列。
<2>设计算法按中序次序输出二叉树中各结点的值及其所对应的层次数。
<3>求二叉树的高度。
<4>求二叉树的结点数。
<5>求二叉树的叶子结点数。
<6>求二叉树的度为2的结点数。
<7>键盘输入一个元素x,求其父节点、兄弟结点、子结点的值,不存在时给出相应提示信息。对兄弟结点和孩子结点,存在时要明确指出是左兄弟、左孩子、右兄弟或右孩子。
<8>键盘输入一个元素x,求其在树中的层次,不存在时给出相应提示信息。
<9>将按顺序方式存储在数组中的二叉树转换为二叉链表形式。(数组中要扩展为完全二叉树)。
<10>交换二叉树中每个结点的左右孩子指针的值。(即:左子树变为右子树,右子树变为左子树)。
(下面为选做实验,有兴趣的同学完成)
<11>复制一棵二叉树T到T1。
<12>输出二叉树从每个叶子结点到根结点的路径(经历的结点)。
<13>对二叉链表表示的二叉树,按从上到下,从左到右打印结点值,即按层次打印。(提示:需要使用队列)
<14>对二叉链表表示的二叉树,求2个结点最近的共同祖先。
实验测试数据基本要求:
<15>求二叉树中一条最长的路径长度(边数),并输出路径上的个结点值。
实验测试数据基本要求:
6.3 实验数据要求
自我编写测试样例,要求每个功能函数的测试样例不少于两组
6.4 运行结果截图及说明
图1 测试(1)、(2)、(3)、(4)、(5)、(6)
图2 测试(1)、(2)、(3)、(4)、(5)、(6)
图3 测试(1)、(2)、(3)、(4)、(5)、(6)
图4 测试(1)、(2)、(3)、(4)、(5)、(6)
图5 测试(1)、(2)、(3)、(4)、(5)、(6)
图6 测试(1)、(2)、(3)、(4)、(5)、(6)
图7 测试(1)、(2)、(3)、(4)、(5)、(6)
图8 测试(1)、(2)、(3)、(4)、(5)、(6)
图9 测试(1)、(2)、(3)、(4)、(5)、(6)
图10 测试(1)、(2)、(3)、(4)、(5)、(6)
图11 测试(1)、(2)、(3)、(4)、(5)、(6)
图12 测试(1)、(2)、(3)、(4)、(5)、(6)
图13 测试(1)、(2)、(3)、(4)、(5)、(6)
图14 测试(1)、(2)、(3)、(4)、(5)、(6)
图15 测试(1)、(2)、(3)、(4)、(5)、(6)
图16 测试(1)、(2)、(3)、(4)、(5)、(6)
图17 测试(1)、(2)、(3)、(4)、(5)、(6)
图18 测试(1)、(2)、(3)、(4)、(5)、(6)
图19 测试(1)、(2)、(3)、(4)、(5)、(6)
图20 测试(1)、(2)、(3)、(4)、(5)、(6)
图21 测试(1)、(2)、(3)、(4)、(5)、(6)
图22 测试(1)、(2)、(3)、(4)、(5)、(6)
图23 测试(1)、(2)、(3)、(4)、(5)、(6)
图24 测试(7)
图25 测试(7)
图26 测试(7)
图27 测试(7)
图28 测试(7)
图29 测试(7)
图30 测试(7)
图31 测试(8)
图32 测试(8)
图33 测试(9)
图34 测试(9)
图35 测试(10)
图36 测试(10)
图37 测试(11)
图38 测试(11)
图39 测试(12)
图40 测试(12)
图41 测试(13)
图42 测试(13)
图43 测试(14)
图44 测试(14)
图45 测试(15)
图46 测试(15)
6.5 附源代码
1 // stdafx.h : include file for standard system include files, 2 // or project specific include files that are used frequently, but 3 // are changed infrequently 4 // 5 6 #if !defined(AFX_STDAFX_H__02F8C78B_9F6E_45FF_BFCE_7F99B5AC9359__INCLUDED_) 7 #define AFX_STDAFX_H__02F8C78B_9F6E_45FF_BFCE_7F99B5AC9359__INCLUDED_ 8 9 #if _MSC_VER > 1000 10 #pragma once 11 #endif // _MSC_VER > 1000 12 13 #include14 #include 15 16 using namespace std; 17 18 typedef char elementType; 19 typedef int elementType1; 20 21 typedef struct node 22 { 23 elementType data;//刚开始应该写成将data写成string或者直接将整个函数写成模板的,写完了最后测试时 24 //才发现现在的写法有诸多不便;但修改的话就又要重构一遍,懒得整了。 25 struct node *leftChild, *rightChild; 26 }bitNode, *binTree; 27 28 typedef struct charNode 29 { 30 //elementType data; 31 bitNode *data;//the type must be bitNode* 32 struct charNode *link; 33 }CLNode, *CPNode; 34 35 36 //typedef struct charNode 37 //{ 38 //elementType data; 39 //struct charNode *leftChild, *rightChild; 40 //}charBitNode, *charBinTree; 41 42 // TODO: reference additional headers your program requires here 43 44 //{{AFX_INSERT_LOCATION}} 45 // Microsoft Visual C++ will insert additional declarations immediately before the previous line. 46 47 #endif // !defined(AFX_STDAFX_H__02F8C78B_9F6E_45FF_BFCE_7F99B5AC9359__INCLUDED_)
1 // charLinkedQueue.h: interface for the charLinkedQueue class.
2 //
3 //////////////////////////////////////////////////////////////////////
4
5 #if !defined(AFX_CHARLINKEDQUEUE_H__13C2F642_81C0_4489_9CF2_3D58D8B48EA9__INCLUDED_)
6 #define AFX_CHARLINKEDQUEUE_H__13C2F642_81C0_4489_9CF2_3D58D8B48EA9__INCLUDED_
7
8 #if _MSC_VER > 1000
9 #pragma once
10 #endif // _MSC_VER > 1000
11
12 //刚开始尝试写英文注释的,后面知难而退了;不过原来的英文注释我保留了
13
14 class charLinkedQueue
15 {
16 public:
17 charLinkedQueue();
18 virtual ~charLinkedQueue();
19 bool emptyCharLinkedQueue();
20 //bool fullSeqCircleQueue();
21 bool enQueue( bitNode *value );//the type must be bitNode*
22 bool deQueue( /*bitNode *value*/ );
23 bool getFront( bitNode *&value );//the type must be bitNode*&
24 int length();
25 friend ostream &operator<<( ostream &os, charLinkedQueue &clq )
26 {
27 /*
28 if( ( scq._front - 1 ) % maxn == scq._rear )
29 return os;
30 int column = 0;
31 for( int i = scq._front; i % maxn != scq._rear; i = ( i + 1 ) % maxn )
32 {
33 os << setw(3) << setiosflags(ios::left) << scq.data[i] << " ";
34 column ++;
35 if( column % 10 == 0 )
36 os << endl;
37 }
38 os << endl;
39 */
40 if( clq._front == NULL )
41 return os;
42 CLNode *tmp = clq._front;
43 int column = 0;
44 while( tmp != clq._rear->link )
45 {
46 os << setw(4) << setiosflags(ios::left) << tmp->data << " ";
47 column ++;
48 tmp = tmp->link;
49 if( column % 10 == 0 )
50 os << endl;
51 }
52 os << endl;
53 }
54 //为了能顺利使用原来的这个代码块来进行二叉树的层次便利,我主要的精力都放在_front、_rear类型、
55 //deQueue()、enQueue()、charNode的类型确定上,经过无数次尝试,总算结果对了----
56 //如果有Git,看了这个代码的每个版本你就会知道我付出了多少心血。。。。
57 private:
58 CLNode *_front;//the type must be CLNode*
59 CLNode *_rear;//the type must be CLNode*
60 };
61
62 #endif // !defined(AFX_CHARLINKEDQUEUE_H__13C2F642_81C0_4489_9CF2_3D58D8B48EA9__INCLUDED_)
1 // _Binary_Tree.h: interface for the _Binary_Tree class.
2 //
3 //////////////////////////////////////////////////////////////////////
4
5 #if !defined(AFX__BINARY_TREE_H__9381B15F_E185_4489_9415_360A22C0A4E2__INCLUDED_)
6 #define AFX__BINARY_TREE_H__9381B15F_E185_4489_9415_360A22C0A4E2__INCLUDED_
7
8 #if _MSC_VER > 1000
9 #pragma once
10 #endif // _MSC_VER > 1000
11
12 #include "charLinkedQueue.h"
13
14 //刚开始尝试写英文注释的,后面知难而退了;不过原来的英文注释我保留了
15
16 class _Binary_Tree
17 {
18 public:
19 _Binary_Tree();//不带参数的构造函数
20 _Binary_Tree( elementType *Arr );//带参数的构造函数
21 void build( elementType *Arr );//从数组建立二叉树,相当于初始化;不带参数的构造函数无法适用于这里
22 void createNode( binTree BT, elementType *Arr, int number );//根据从数组读到的数据先序递归建树
23 virtual ~_Binary_Tree();//析构函数
24 bool createBinaryTree( binTree &BT, elementType stringLine[100][3], int length, int &row );//根据文本数据
25 //先序构造二叉树
26 bool readFileToArray( elementType stringLine[100][3], int &length );//将文本数据读入二维数组中
27 bool emptyBinaryTree();//二叉树判空,仅适用于带参数构造函数建立的二叉树
28 bool _exit( binTree BT, elementType value );//判断节点数据是否在二叉树中
29 binTree getNodePoint();//返回根节点地址
30 binTree getNodePoint( binTree BT, elementType value );//返回value在二叉树中的地址
31 binTree getParent( binTree BT, elementType value );//返回value的父母
32 void PreOrderTraverse(binTree BT);//前序遍历
33 void InOrderTraverse(binTree BT);//中序遍历
34 void PostOrderTraverse(binTree BT);//后序遍历
35 void levelOrderTraverse(binTree BT);//层次遍历
36 void destroy( binTree BT );//销毁二叉树
37 void level( binTree BT, int number );//求二叉树中各个节点的层次
38 int height( binTree BT );//求二叉树高度
39 int numberOfBTreeNode( binTree BT );//返回二叉树节点总数
40 int numberOfBTreeLeafNode( binTree BT, int &number );//返回二叉树叶节点个数
41 void numberOfNodeDegreeTwo( binTree BT, int &number );//求二叉树中度为2的节点个数
42 //void family( binTree BT, elementType1 number );
43 void getParent( binTree BT, elementType value, bool &flag );//求value的父节点
44 void getSibling( binTree BT, elementType value, bool &flag );//when call the function, the parameter flag
45 //must be assigned for false
46 //求value的兄弟节点,法1;有一个bug
47 void getSibling( binTree BT, elementType value );//求value的兄弟节点,法2
48 void getChild( binTree BT, elementType value, bool &flag );//求value孩子节点
49 int levelJudge( binTree BT, elementType value, int &number, int level );//返回value节点的层次
50 void exchangeLeftAndRightSibling( binTree BT );//交换左右子树
51 void copyBTree( binTree BT1, binTree BT );//复制二叉树
52 charLinkedQueue clq;//包含
53 void allLeafToRootPath( binTree BT, elementType *path, int &pathLength );//求所有叶节点到根节点路径
54 void binaryTreeLongestPath( binTree BT, elementType *path, int &pathLength,
55 elementType *longestPath, int &longestLength );//求叶节点到根节点的最长路径
56 binTree nearestAncestor( binTree BT, bitNode *BNode1, bitNode *BNode2 );//求两个节点的最近祖先
57 //本来打算用elementType数据
58 //作为参数的,后面发现行不通
59 //可能是我太菜了吧
60 private:
61 bitNode *BTree;
62
63 };
64
65 #endif // !defined(AFX__BINARY_TREE_H__9381B15F_E185_4489_9415_360A22C0A4E2__INCLUDED_)
1 // charLinkedQueue.cpp: implementation of the charLinkedQueue class.
2 //
3 //////////////////////////////////////////////////////////////////////
4
5 #include "stdafx.h"
6 #include "charLinkedQueue.h"
7
8 //////////////////////////////////////////////////////////////////////
9 // Construction/Destruction
10 //////////////////////////////////////////////////////////////////////
11
12 charLinkedQueue::charLinkedQueue()
13 {
14 _front = _rear = NULL;
15 }
16
17 charLinkedQueue::~charLinkedQueue()
18 {
19 CLNode *tmp = NULL;
20 while( _front != _rear )
21 {
22 tmp = _front;
23 _front = _front->link;
24 delete tmp;
25 }
26 cout << "The charLinkedQueue destruction has been called!" << endl;
27 }
28
29 bool charLinkedQueue::emptyCharLinkedQueue()
30 {
31 return _front == NULL;
32 }
33
34 bool charLinkedQueue::enQueue( bitNode *value )
35 {
36 CLNode *newNode = new CLNode;
37 if( !newNode )
38 {
39 cerr << "Space allocating falied!Error in charLinkedQueue::enQueue()!" << endl;
40 return false;
41 }
42 newNode->data = value;
43 newNode->link = NULL;
44 if( emptyCharLinkedQueue() )
45 {
46 _front = _rear = newNode;
47 }
48 else
49 {
50 _rear->link = newNode;
51 _rear = newNode;
52 }
53 return true;
54 }
55
56 bool charLinkedQueue::deQueue( /*elementType &value*/ )
57 {
58 if( emptyCharLinkedQueue() )
59 {
60 cerr << "Node deleting falied!Error in charLinkedQueue::deQueue()!" << endl;
61 return false;
62 }
63 CLNode *tmp = _front;
64 //value = _front->data;
65 _front = _front->link;
66 delete tmp;
67 if( _front == NULL )
68 _rear = NULL;
69 return true;
70 }
71
72 bool charLinkedQueue::getFront( bitNode *&value )
73 {
74 if( emptyCharLinkedQueue() )
75 {
76 cerr << "Queue is empty!\nNode-data acquiring falied!Error in charLinkedQueue::deQueue()!" << endl;
77 return false;
78 }
79 value = _front->data;//原来我是注释掉的,导致输出一直是A;
80 return true;
81 }
82
83 int charLinkedQueue::length()
84 {
85 if( emptyCharLinkedQueue() )
86 {
87 cerr << "Queue is empty!" << endl;
88 return -1;
89 }
90 CLNode *tmp = _front;
91 int _size = 0;
92 while( tmp != NULL )
93 {
94 tmp = tmp->link;
95 _size ++;
96 }
97 return _size;
98 }
1 // _Binary_Tree.cpp: implementation of the _Binary_Tree class.
2 //
3 //////////////////////////////////////////////////////////////////////
4
5 #include "stdafx.h"
6 #include "_Binary_Tree.h"
7 #include "charLinkedQueue.h"
8
9 //////////////////////////////////////////////////////////////////////
10 // Construction/Destruction
11 //////////////////////////////////////////////////////////////////////
12
13
14 _Binary_Tree::_Binary_Tree() //新建一个结点
15 {
16 //BTree = NULL;
17 BTree = new bitNode;
18 BTree->leftChild = BTree->rightChild = NULL;
19 }
20
21 _Binary_Tree::~_Binary_Tree()
22 {
23 destroy(BTree);//析构函数不能带参数,只能这么处理了
24 }
25
26 _Binary_Tree::_Binary_Tree( elementType *Arr )
27 {
28 BTree = NULL;
29 build(Arr);
30 }
31
32 void _Binary_Tree::build( elementType *Arr )
33 {
34 if(BTree)
35 destroy(BTree);
36 if( Arr[0] == '^' )
37 {
38 BTree = NULL;
39 return;
40 }
41 BTree = new bitNode;
42 BTree->leftChild = NULL;
43 BTree->rightChild = NULL;
44 BTree->data = Arr[0];
45 createNode( BTree, Arr, 0 );
46 }
47
48 void _Binary_Tree::createNode( binTree BT, elementType *Arr, int number )
49 {
50 bitNode *tmp = new bitNode;
51 if( Arr[ number * 2 + 1 ] != '^' )
52 {
53 BT->leftChild =new bitNode ;
54 tmp = BT->leftChild;
55 tmp->data = Arr[ number * 2 + 1 ];
56 tmp->leftChild = NULL;
57 tmp->rightChild = NULL;
58 createNode( tmp, Arr, number * 2 + 1 );
59 }
60 if( Arr[ number * 2 + 2 ] != '^' )
61 {
62 BT->rightChild =new bitNode ;
63 tmp = BT->rightChild;
64 tmp->data = Arr[ number * 2 + 2 ];
65 tmp->leftChild = NULL;
66 tmp->rightChild = NULL;
67 createNode( tmp, Arr, number * 2 + 2 );
68 }
69 }
70
71 bool _Binary_Tree::createBinaryTree( binTree &BT, elementType stringLine[100][3], int length, int &row )
72 {
73 if (row >= length || length == 0 ) //strlen存数据的二维数组,nRow结点所在的位数,nlen结点的个数
74 return false;
75 if ( row == 0 )
76 BT = BTree;
77 else
78 BT = new bitNode;//new下面是公用的,用if的目的是改变private里BTree里的值
79 BT->data = stringLine[row][0];
80 BT->leftChild = NULL;
81 BT->rightChild = NULL;
82
83 int nextRow = row;
84 if ( stringLine[nextRow][1] == '1' )
85 {
86 ++ row;
87 createBinaryTree( BT->leftChild, stringLine, length, row );
88 }
89 if ( stringLine[nextRow][2] == '1' )
90 {
91 ++row;
92 createBinaryTree( BT->rightChild, stringLine, length, row );
93 }
94 return true;
95 }
96
97 bool _Binary_Tree::readFileToArray( elementType stringLine[100][3], int &length )
98 {
99 FILE *fp;
100 char str[100];
101
102 cout << "Please input the file name(belike includes the file path):" << endl;
103 char name[50];// = "bt10.btr";
104 cin >> name;
105 fp = fopen( name, "r" );
106 if (!fp)
107 {
108 cout << "Error!" << endl;
109 return false;
110 }
111 if (fgets(str, 1000, fp) != NULL)
112 {
113 if (strcmp(str, "BinaryTree\n") != 0)
114 {
115 cout << "Error!" << endl;
116 fclose(fp);
117 return false;
118 }
119 }
120 length = 0;
121 while (fscanf(fp, "%c %c %c\n", &stringLine[length][0], &stringLine[length][1], &stringLine[length][2]) != EOF)
122 {
123 length ++;
124 }
125 fclose(fp);
126 return true;
127 }
128
129
130 bool _Binary_Tree::emptyBinaryTree()
131 {
132 //if(BTree)
133 //return BTree->leftChild == NULL && BTree->rightChild == NULL;
134 //else
135 return BTree == NULL;
136 }
137
138 bool _Binary_Tree::_exit( binTree BT, elementType value )
139 {
140 if(!BT)
141 return false;
142 //return NULL;
143 if( BT->data == value )
144 return true;
145 //return BT;
146 //bitNode *index = _exit( BT->leftChild, value );
147 bool flag = _exit( BT->leftChild, value );
148 //if(!index)
149 if(!flag)
150 //_exit( BT->leftChild, value );
151 _exit( BT->rightChild, value );
152 }
153
154 binTree _Binary_Tree::getNodePoint()
155 {
156 //if( emptyBinaryTree() )
157 //{
158 //throw "Empty binary tree!Error in binTree _Binary_Tree::getNodePoint()!\n";
159 //return NULL;
160 //}
161 return (*this).BTree;
162 }
163
164 binTree _Binary_Tree::getNodePoint( binTree BT, elementType value )
165 {
166 /*
167 if(!BT)
168 {
169 return NULL;
170 }
171 else
172 {
173 if( BT->data == value )
174 return BT;
175 else
176 {
177 bitNode *tmp;
178 if( tmp = getNodePoint( BT->leftChild, value ) )
179 return tmp;
180 if( tmp = getNodePoint( BT->rightChild, value ) )
181 return tmp;
182 return NULL;
183 }
184 }
185 */
186 if(!BT)
187 {
188 return NULL;
189 }
190 else
191 {
192 if( BT->data == value )
193 {
194 return BT;
195 }
196 //getNodePoint( BT->leftChild, value );
197 //getNodePoint( BT->rightChild, value );
198
199 bitNode *tmp = getNodePoint( BT->leftChild, value );
200 if(!tmp)
201 {
202 getNodePoint( BT->rightChild, value );
203 }
204 //follow statement can't be added to the code
205 //return tmp;
206 }
207 }
208
209 void _Binary_Tree::PreOrderTraverse(binTree BT)
210 {
211 //if( emptyBinaryTree() )
212 // {
213 //throw "Empty binary tree!Error in void _Binary_Tree::PreOrderTraverse(binTree BT) !\n";
214 //return;
215 //}
216 if (BT)
217 {
218 cout << BT->data << " ";
219 PreOrderTraverse(BT->leftChild);
220 PreOrderTraverse(BT->rightChild);
221 }
222 }
223
224 void _Binary_Tree::InOrderTraverse(binTree BT)
225 {
226 if (BT)
227 {
228 InOrderTraverse(BT->leftChild);
229 cout << BT->data << " ";
230 InOrderTraverse(BT->rightChild);
231 }
232 //return 0;
233 }
234
235 void _Binary_Tree::PostOrderTraverse( binTree BT )
236 {
237 if (BT)
238 {
239 PostOrderTraverse(BT->leftChild);
240 PostOrderTraverse(BT->rightChild);
241 cout << BT->data << " ";
242 }
243 }
244
245 void _Binary_Tree::destroy( binTree BT )
246 {
247 if(BT)
248 {
249 destroy( BT->leftChild );
250 destroy( BT->rightChild );
251 delete BT;
252 BT = NULL;
253 }
254 }
255
256 void _Binary_Tree::level( binTree BT, int number )
257 {
258
259 if(BT)
260 {
261 level( BT->leftChild, number + 1 );
262 ///number +=3;
263 //cout << number << endl;
264 cout << BT->data << " level: " << number << endl;
265
266 level( BT->rightChild, number + 1 );
267 //number -=2;
268 }
269 //number --;
270 }
271
272 int _Binary_Tree::height( binTree BT )
273 {
274 if(!BT)
275 {
276 return 0;
277 }
278 else
279 {
280 int i = height( BT->leftChild );
281 int j = height( BT->rightChild );
282 return i < j ? j + 1 : i + 1;
283
284 }
285 }
286
287 int _Binary_Tree::numberOfBTreeNode( binTree BT )
288 {
289 if(!BT)
290 return 0;
291 else
292 {
293 return numberOfBTreeNode( BT->leftChild ) + numberOfBTreeNode( BT->rightChild ) + 1;
294 }
295 }
296
297 int _Binary_Tree::numberOfBTreeLeafNode( binTree BT, int &number )
298 {
299 if(!BT)
300 {
301 return 0;
302 }
303 else
304 {
305 if( !BT->leftChild && !BT->rightChild )
306 //number += 1;
307 number ++;
308 //return 1;
309 else
310 {
311 numberOfBTreeLeafNode( BT->leftChild, number );
312 numberOfBTreeLeafNode( BT->rightChild, number );
313 }
314 return number;
315 }
316 }
317
318 void _Binary_Tree::numberOfNodeDegreeTwo( binTree BT, int &number )
319 {
320 if(!BT)
321 {
322 return;
323 }
324 else
325 {
326 if( BT->leftChild && BT->rightChild )
327 //number += 1;
328 number += 1;
329 //return 1;
330 //else
331 //{
332 numberOfNodeDegreeTwo( BT->leftChild, number );
333 numberOfNodeDegreeTwo( BT->rightChild, number );
334 //return numberOfNodeDegreeTwo( BT->leftChild, number ) + numberOfNodeDegreeTwo( BT->rightChild, number );
335 //}
336 //return number;
337 }
338 }
339
340 /*
341 void _Binary_Tree::family( binTree BT, elementType1 number )
342 {
343 if(!BT)
344 {
345 return;
346 }
347 if( BT->leftChild->data == number || BT->rightChild->data == number )
348 {
349 cout << "parent ---- " << BT->data << endl;
350 if( BT->leftChild->data == number && BT->rightChild )
351 {
352 cout << "rights sibling ---- " << BT->rightChild->data << endl;
353 }
354 if( BT->leftChild && BT->rightChild->data == number )
355 {
356 cout << "left sibling ---- " << BT->leftChild->data << endl;
357 }
358 }
359 if( BT->data == number && ( BT->leftChild || BT->rightChild ) )
360 {
361 cout << ( BT->leftChild ? "left child ---- " : true ) << endl;
362 cout << ( BT->rightChild ? "right child ---- " : true ) << endl;
363 }
364 family( BT->leftChild, number );
365 family( BT->rightChild, number );
366 //if( BT->data == number && BT-)
367 //if( BT->leftChild->data == number &&)
368 }
369 */
370
371 //bool _Binary_Tree::getParent( binTree BT, elementType number, bool flag )
372 void _Binary_Tree::getParent( binTree BT, elementType value, bool &flag )
373 {
374 if(!BT)
375 {
376 //return false;
377 return;
378 }
379 if( ( BT->leftChild && BT->leftChild->data == value ) || ( BT->rightChild ) && ( BT->rightChild->data == value ) )
380 {
381 flag = true;
382 cout << value << " Parent ---- " << BT->data << endl;
383 return;
384 //return true;
385 }
386 /*
387 if( BT && BT->rightChild->data == number )
388 {
389 cout << "parent ---- " << BT->data << endl;
390 return true;
391 }
392 */
393 getParent( BT->leftChild, value, flag );
394 getParent( BT->rightChild, value, flag );
395 }
396
397 binTree _Binary_Tree::getParent( binTree BT, elementType value )
398 {
399
400 if( !_exit( BT, value ) )
401 {
402 cerr << value << " is not in the binary tree!" << endl;
403 cerr << "Error in binTree _Binary_Tree::getParent( binTree BT, elementType value )!" << endl;
404 return NULL;
405 }
406
407 if(!BT)
408 {
409 return NULL;
410 }
411 if( BT->data == value )
412 {
413 return BT;
414 }
415 if( ( BT->leftChild && BT->leftChild->data == value ) || ( BT->rightChild && BT->rightChild->data == value ) )//|| BT->rightChild->data == value )
416 {
417 return BT;
418 }
419 bitNode *tmp = getParent( BT->leftChild, value );
420 if(!tmp)
421 {
422 getParent( BT->rightChild, value );
423 }
424 }
425
426 void _Binary_Tree::getSibling( binTree BT, elementType value, bool &flag )
427 {
428 if(!BT)
429 {
430 cout << value << " No LeftSibling!" << endl << value << " No RightSibling!" << endl;
431 return;
432 }
433 if( !flag && !BT->leftChild )//|| !BT->rightChild )//write as "if(!BT)" would result error
434 {
435
436 if( BT->rightChild )
437 {
438 getSibling( BT->rightChild, value, flag );
439 //return;
440 }
441 else
442 {
443 //cout << value << " No LeftSibling!" << endl;
444 return;
445 }
446 return;//why would deleting the statement cause error!
447 }
448
449 if( !flag && !BT->rightChild )
450 {
451
452 if( BT->leftChild )
453 {
454 getSibling( BT->leftChild, value, flag );
455
456 }
457 else
458 {
459 //cout << value << "No LeftSibling!" << endl;
460 //cout << value << " No RightSibling!" << endl;
461 return;
462
463 }
464 return;//why would deleting the statement cause error!
465 }
466 if( BT->rightChild->data == value )
467 {
468 if( BT->leftChild )
469 {
470 flag = true;
471 cout << value << " LeftSibling ---- " << BT->leftChild->data << endl;
472 return;
473 }
474 else if( !BT->leftChild )
475 {
476 cout << value << " No LeftSibling!" << endl;
477 return;
478 }
479
480 }
481 if( BT->leftChild->data == value )
482 {
483 if( BT->rightChild )
484 {
485 flag = true;
486 cout << value << " RightSibling ---- " << BT->rightChild->data << endl;
487 return;
488 }
489 else if( !BT->rightChild )
490 {
491 cout << value << " No RightSibling!" << endl;
492 return;
493 }
494 }
495 getSibling( BT->leftChild, value, flag );
496 if( !flag && BT->rightChild )
497 getSibling( BT->rightChild, value, flag );
498 }
499
500 void _Binary_Tree::getSibling( binTree BT, elementType value )
501 {
502 bitNode *parent = getParent( BT, value );
503
504 if( BT->data == value )
505 {
506 cout << value << " is the root node,neither left sibling also useless right sibling!" << endl;
507 return;
508 }
509 if( !_exit( BT, value ) )
510 {
511 cout << value << " is not in the binary-tree!" << endl;
512 cerr << "Error in void _Binary_Tree::getSibling( binTree BT, elementType value )!" << endl;
513 return;
514 }
515 if( parent->leftChild && parent->leftChild->data == value )
516 {
517 if( parent->rightChild )
518 {
519 cout << value << " RightSibling ---- " << parent->rightChild->data << endl;
520 return;
521 }
522 else
523 {
524 cout << value << " No RightSibling!" << endl;
525 return;
526 }
527 }
528 if( parent->rightChild && parent->rightChild->data == value )
529 {
530 if( parent->leftChild )
531 {
532 cout << value << " LeftSibling ---- " << parent->leftChild->data << endl;
533 return;
534 }
535 else
536 {
537 cout << value << " No LeftSibling!" << endl;
538 return;
539 }
540 }
541 }
542
543 void _Binary_Tree::getChild( binTree BT, elementType value, bool &flag )//It costed me several minutes to
544 { //write and almost one hour to
545 /* //perfect the function
546 if( BT->leftChild )
547 {
548 getChild( BT->leftChild, value, flag );
549 }
550 if( BT->rightChild )
551 {
552 getChild( BT->rightChild, value, flag );
553 }
554 */
555
556 /*
557 if( !BT->leftChild )//|| !BT->rightChild )
558 {
559 if(flag)
560 {
561 cout << "No LeftChild! " << endl;
562 flag = true;
563 return;
564 }
565 else
566 {
567 cout << "No LeftChild! " << endl;
568 flag = false;
569 }
570 //return;
571 }
572 if( !BT->rightChild )
573 {
574 if(flag)
575 {
576 cout << "No RightChild! " << endl;
577 flag = true;
578 return;
579 }
580 else
581 {
582 cout << "No RightChild! " << endl;
583 flag = false;
584 }
585 }
586 */
587 //if(!BT)
588 // {
589 // return;
590 // }
591 if( !_exit( BT, value ) )
592 {
593 cerr << value << " is not in the binary tree!\nError in void _Binary_Tree::getChild( binTree BT, elementType value, bool &flag )" << endl;
594 return;
595 }
596 if( BT->data == value )//at first I neglected this detail that resulted wrong judgement at root-node
597 {
598 if( BT->leftChild )
599 {
600 flag = true;
601 cout << value << " LeftChild ---- " << BT->leftChild->data << endl;
602
603 }
604 else
605 {
606 cout << "No LeftChild!" << endl;
607
608 }
609 if( BT->rightChild )
610 {
611 flag = true;
612 cout << value << " RightChild ---- " << BT->rightChild->data << endl;
613 return;
614 }
615 else
616 {
617 cout << "No RightChild! " << endl;
618 return;
619 }
620 }
621 if( !BT->leftChild )
622 {
623 if( BT->rightChild )
624 {
625 getChild( BT->rightChild, value, flag );
626 }
627 return;
628 /*
629 if(flag)
630 {
631 return;
632 }
633 else
634 {
635 flag = false;
636 return;
637 }*/
638 }
639 if( !BT->rightChild )
640 {
641 if( BT->leftChild )
642 {
643 getChild( BT->leftChild, value, flag );
644 }
645 return;
646 //if(flag)
647 //{
648 // flag = false;
649 //}
650 /*
651 if(flag)
652 {
653 return;
654 }
655 else
656 {
657 flag = false;
658 return;
659 }*/
660 }
661 /*
662 if( BT->rightChild->data == value )
663 {
664 if( BT->rightChild->leftChild )
665 {
666 flag = true;
667 cout << value << " LeftChild ---- " << BT->rightChild->leftChild->data << endl;
668 //return;
669 }
670 else
671 {
672 cout << "No LeftChild!" << endl;
673 }
674 if( BT->rightChild->rightChild )
675 {
676 flag = true;
677 cout << value << " RightChild ---- " << BT->rightChild->rightChild->data << endl;
678 return;
679 }
680 else
681 {
682 cout << "No RightChild! " << endl;
683 return;
684 }
685 //else
686 //{
687 //flag = false;
688 // return;
689 //}
690 }
691 if( BT->leftChild->data == value )
692 {
693 if( BT->leftChild->leftChild )
694 {
695 flag = true;
696 cout << value << " LeftChild ---- " << BT->leftChild->leftChild->data << endl;
697 //return;
698 }
699 else
700 {
701 cout << "No LeftChild!" << endl;
702 }
703 if( BT->leftChild->rightChild )
704 {
705 flag = true;
706 cout << value << " RightChild ---- " << BT->leftChild->rightChild->data << endl;
707 return;
708 }
709 else
710 {
711 cout << "No RightChild! " << endl;
712 return;
713 }
714 //else
715 //{
716 //flag = false;
717 // return;
718 //}
719 }
720 */
721 getChild( BT->leftChild, value, flag );
722 getChild( BT->rightChild, value, flag );
723 }
724
725 int _Binary_Tree::levelJudge( binTree BT, elementType value, int &number, int level )
726 {
727 bitNode *position = getNodePoint( getNodePoint(), value );
728 if(!position)
729 {
730 cout << "The value you typed is not in the binary tree!" << endl;
731 //return -1;
732 number = -1;
733 return number;
734 }
735 /*
736 int level;
737 if ( BT == NULL )
738 return 0;
739 else if ( BT->data == value )
740 return number;
741 else
742 {
743 number ++;
744 level = levelJudge( BT->leftChild, value, number );
745 if ( level != 0 )
746 return number;
747 else
748 {
749 //number ++;
750 return levelJudge( BT->rightChild, value, number );
751 }
752 }
753 */
754 if(BT)
755 {
756 if( BT->data == value )
757 {
758 //number ++;
759 number = level;
760 }
761 //number ++;
762 levelJudge( BT->leftChild, value, number, level + 1 );
763 //number ++;
764 levelJudge( BT->rightChild, value, number, level + 1);
765 }
766 }
767
768 void _Binary_Tree::exchangeLeftAndRightSibling( binTree BT )
769 {
770 if( BT && BT->leftChild && BT->rightChild )
771 {
772 bitNode *tmp = BT->leftChild;
773 BT->leftChild = BT->rightChild;
774 BT->rightChild = tmp;
775 exchangeLeftAndRightSibling( BT->leftChild );
776 exchangeLeftAndRightSibling( BT->rightChild );
777 }
778 }
779
780 void _Binary_Tree::copyBTree( binTree BT1, binTree BT )
781 {
782 bitNode *tmp = NULL;//new bitNode;
783 BT1->data = BT->data;
784 if( BT->leftChild )
785 {
786 BT1->leftChild = new bitNode;
787 tmp = BT1->leftChild;
788 tmp->leftChild = NULL;
789 tmp->rightChild = NULL;
790 copyBTree( tmp, BT->leftChild );
791 }
792 if( BT->rightChild )
793 {
794 BT1->rightChild = new bitNode;
795 tmp = BT1->rightChild;
796 tmp->leftChild = NULL;
797 tmp->rightChild = NULL;
798 copyBTree( tmp, BT->rightChild );
799 }
800 }
801
802 void _Binary_Tree::levelOrderTraverse( binTree BT )
803 {
804 clq.enQueue(BT);
805 while( !clq.emptyCharLinkedQueue() )
806 {
807 //CLNode *tmp = NULL;
808 clq.getFront(BT);
809 cout << BT->data << " ";
810 clq.deQueue();
811 if( BT->leftChild != NULL )
812 {
813 clq.enQueue( BT->leftChild );
814 }
815 if( BT->rightChild != NULL )
816 {
817 clq.enQueue( BT->rightChild );
818 }
819 }
820 }
821
822 void _Binary_Tree::allLeafToRootPath( binTree BT, char *path, int &pathLength )
823 {
824 if(BT)
825 {
826 if( !BT->leftChild && !BT->rightChild )
827 {
828 path[pathLength] = BT->data;
829 cout << BT->data << " leaf to root path: " << endl;
830 for( int i = pathLength; i >= 0; i -- )
831 {
832 if( i != 0 )
833 cout << path[i] << " --> ";
834 else
835 cout << path[i] << "\n";
836 }
837 //cout << endl;
838 }
839 else
840 {
841 path[ pathLength ++ ] = BT->data;
842 allLeafToRootPath( BT->leftChild, path, pathLength );
843 allLeafToRootPath( BT->rightChild, path, pathLength );
844 pathLength --;
845 }
846 }
847 }
848
849 void _Binary_Tree::binaryTreeLongestPath( binTree BT, elementType *path, int &pathLength,
850 elementType *longestPath, int &longestLength )
851 {
852 if(BT)
853 {
854 if( !BT->leftChild && !BT->rightChild )
855 {
856 path[pathLength] = BT->data;
857 if( pathLength > longestLength)
858 {
859 //cout << BT->data << " leaf to root path: " << endl;
860 //longestPath = pathLength;
861 for( int i = pathLength; i >= 0; i -- )
862 {
863 /*
864 if( i != 0 )
865 cout << path[i] << " --> ";
866 else
867 cout << path[i] << "\n";
868 */
869 longestPath[i] = path[i];
870 }
871 longestLength = pathLength;
872 }
873 //longestLength = pathLength;
874 //cout << endl;
875 }
876 else
877 {
878 path[ pathLength ++ ] = BT->data;
879 binaryTreeLongestPath( BT->leftChild, path, pathLength, longestPath, longestLength );
880 binaryTreeLongestPath( BT->rightChild, path, pathLength, longestPath, longestLength );
881 pathLength --;
882 }
883 }
884 }
885
886 binTree _Binary_Tree::nearestAncestor( binTree BT, bitNode *BNode1, bitNode *BNode2 )
887 {
888 // if( !_exit( BT, BNode1->data ) )
889 //{
890 // cout << BNode1->data << " is not in the binary tree!" << endl;
891 // return NULL;
892 //}
893 //if( !_exit( BT, BNode2->data ) )
894 //{
895 // cout << BNode2->data << " is not in the binary tree!" << endl;
896 // return NULL;
897 //}
898 if( !BT || !BNode1 || !BNode2 )
899 {
900 //cout << "NO ANCESTOR!" << endl;
901 return NULL;
902 }
903 if( BT == BNode1 || BT == BNode2 )
904 {
905 //cout << BT->data << endl;
906 return BT;
907 }
908 bitNode *left = nearestAncestor( BT->leftChild, BNode1, BNode2 );
909 bitNode *right = nearestAncestor( BT->rightChild, BNode1, BNode2 );
910 if( left && right )
911 {
912 //cout << BT->data << endl;
913 return BT;
914 }
915 else if(!left)
916 {
917 //cout << right->data << endl;
918 return right;
919 }
920 else
921 {
922 //cout << left->data << endl;
923 return left;
924 }
925 }
1 // BinaryTree.cpp : Defines the entry point for the console application.
2 //
3
4 #include "stdafx.h"
5 #include "_Binary_Tree.h"
6 #include "charLinkedQueue.h"
7
8
9 void test1()
10 {
11 _Binary_Tree BT1;
12 elementType strLine[100][3];
13 int nRow = 0, nLen = 0;
14 binTree index;
15 BT1.readFileToArray(strLine,nLen);
16 //BT1._Binary_Tree();
17
18 BT1.createBinaryTree( index,strLine, nLen, nRow);
19
20 cout << "The preorder traversal of sequence is" << endl;
21 BT1.PreOrderTraverse(BT1.getNodePoint());
22 cout << endl;
23 cout << "The middle order traversal of sequence is" << endl;
24 BT1.InOrderTraverse(BT1.getNodePoint());
25 cout << endl;
26 cout << "The post order traversal of sequence is" << endl;
27 BT1.PostOrderTraverse(BT1.getNodePoint());
28 cout << endl;
29 cout << "The level order traversal of sequence is" << endl;
30 BT1.levelOrderTraverse( BT1.getNodePoint() );
31 cout << endl;
32 int n = 1;
33 BT1.level( BT1.getNodePoint() , n );
34 cout << "BTree height: "<< BT1.height( BT1.getNodePoint() ) << endl;
35 cout << "Total node: " << BT1.numberOfBTreeNode( BT1.getNodePoint() ) << endl;
36 int m = 0;
37 cout << "Leaf node: " << BT1.numberOfBTreeLeafNode( BT1.getNodePoint(), m ) << endl;
38 int a = 0;
39 BT1.numberOfNodeDegreeTwo( BT1.getNodePoint(), a );
40 cout << "Node degree two: " << a << endl;
41 }
42
43 void test2()
44 {
45 _Binary_Tree BT1;
46 elementType strLine[100][3];
47 int nRow = 0, nLen = 0;
48 binTree index;
49 BT1.readFileToArray(strLine,nLen);
50 //BT1._Binary_Tree();
51
52 BT1.createBinaryTree( index,strLine, nLen, nRow);
53 char ch;
54 int key;
55 cout << "Please input a letter as operational character and a number to choose the operation,separated by space.\n\"1\" for searching parent-node,\"2\" for searching sibiling-node and \"3\" for searching child-node." << endl;
56 while( cin>> ch >> key )
57 {
58 if( key == 1 )
59 {
60 bool flag = false;
61 bitNode *index = NULL;
62 index = BT1.getParent( BT1.getNodePoint(), ch );
63 if( index && index != BT1.getNodePoint() )
64 cout << ch << " parent ---- " << index->data << endl;
65 else if( index && index->data == ch )
66 cout << ch << " is the root node, no parent." << endl;
67 else if(index)
68 cout << ch << " parent ---- " << index->data << endl;
69 }
70 else if( key == 2 )
71 {
72 BT1.getSibling( BT1.getNodePoint(), ch );
73 }
74 else if( key == 3 )
75 {
76 bool flag;
77 BT1.getChild( BT1.getNodePoint(), ch, flag );
78 }
79 //Sleep( 1000 * 60 );
80 //system( "cls" );
81 //cout << "Please input a letter as operational character and a number to choose the operation,separated by space.\n\"1\" for searching parent-node,\"2\" for searching sibiling-node and \"3\" for searching child-node." << endl;
82 }
83 }
84
85 void test3()
86 {
87 _Binary_Tree BT1;
88 elementType strLine[100][3];
89 int nRow = 0, nLen = 0;
90 binTree index;
91 BT1.readFileToArray(strLine,nLen);
92 //BT1._Binary_Tree();
93
94 BT1.createBinaryTree( index,strLine, nLen, nRow);
95
96 elementType value;
97 int cnt = 0;
98 cout << "Please input a letter and the program will judge it in which layer of the binary-tree!" << endl;
99 while( cin >> value )
100 {
101 int number = 1;
102 BT1.levelJudge( BT1.getNodePoint(), value , number, 1 );
103 cout << value << " ---- " << number << " level!" << endl;
104 cnt ++;
105 //Sleep( 1000 * 60 );
106 if( cnt % 10 == 0 )
107 system( "cls" );
108
109 cout << "Please input a letter and the program will judge it in which layer of the binary-tree!" << endl;
110 }
111 }
112
113 void test4()
114 {
115 elementType str[10000];
116 cout << "Please input a character array that will be transformed to the elements of a binary tree.\nAttention the typed array must extend for the complete binary tree!" << endl;
117 while( cin >> str )
118 {
119 _Binary_Tree BT1(str);
120 cout << "The preorder traversal of sequence is" << endl;
121 BT1.PreOrderTraverse(BT1.getNodePoint());
122 cout << endl;
123 cout << "The middle order traversal of sequence is" << endl;
124 BT1.InOrderTraverse(BT1.getNodePoint());
125 cout << endl;
126 cout << "The post order traversal of sequence is" << endl;
127 BT1.PostOrderTraverse(BT1.getNodePoint());
128 cout << endl;
129 cout << "The level order traversal of sequence is" << endl;
130 BT1.levelOrderTraverse( BT1.getNodePoint() );
131 cout << endl;
132 int n = 1;
133 BT1.level( BT1.getNodePoint() , n );
134 cout << "BTree height: "<< BT1.height( BT1.getNodePoint() ) << endl;
135 cout << "Total node: " << BT1.numberOfBTreeNode( BT1.getNodePoint() ) << endl;
136 int m = 0;
137 cout << "Leaf node: " << BT1.numberOfBTreeLeafNode( BT1.getNodePoint(), m ) << endl;
138 int a = 0;
139 BT1.numberOfNodeDegreeTwo( BT1.getNodePoint(), a );
140 cout << "Node degree two: " << a << endl;
141 Sleep( 1000 * 60 );
142 system( "cls" );
143 cout << "Please input a character array that will be transformed to the elements of a binary tree.\nAttention the typed array must extend for the complete binary tree!" << endl;
144 }
145 }
146
147 void test5()
148 {
149 _Binary_Tree BT1;
150 elementType strLine[100][3];
151 int nRow = 0, nLen = 0;
152 binTree index;
153 BT1.readFileToArray(strLine,nLen);
154 //BT1._Binary_Tree();
155
156 BT1.createBinaryTree( index,strLine, nLen, nRow);
157 cout << "The program will exchange the left subtree and right subtree of the file-inputed binary tree!" << endl;
158 cout << "The origin binary tree is as follow:" << endl;
159
160 cout << "The preorder traversal of sequence is" << endl;
161 BT1.PreOrderTraverse(BT1.getNodePoint());
162 cout << endl;
163 cout << "The middle order traversal of sequence is" << endl;
164 BT1.InOrderTraverse(BT1.getNodePoint());
165 cout << endl;
166 cout << "The post order traversal of sequence is" << endl;
167 BT1.PostOrderTraverse(BT1.getNodePoint());
168 cout << endl;
169 cout << "The level order traversal of sequence is" << endl;
170 BT1.levelOrderTraverse( BT1.getNodePoint() );
171 cout << endl;
172
173 BT1.exchangeLeftAndRightSibling( BT1.getNodePoint() );
174 cout << "The following for the exchange of binary tree:" << endl;
175 cout << "The preorder traversal of sequence is" << endl;
176 BT1.PreOrderTraverse(BT1.getNodePoint());
177 cout << endl;
178 cout << "The middle order traversal of sequence is" << endl;
179 BT1.InOrderTraverse(BT1.getNodePoint());
180 cout << endl;
181 cout << "The post order traversal of sequence is" << endl;
182 BT1.PostOrderTraverse(BT1.getNodePoint());
183 cout << endl;
184 cout << "The level order traversal of sequence is" << endl;
185 BT1.levelOrderTraverse( BT1.getNodePoint() );
186 cout << endl;
187 }
188
189 void test6()
190 {
191 _Binary_Tree BT1;
192 elementType strLine[100][3];
193 int nRow = 0, nLen = 0;
194 binTree index;
195 BT1.readFileToArray(strLine,nLen);
196 //BT1._Binary_Tree();
197
198 BT1.createBinaryTree( index,strLine, nLen, nRow);
199 cout << "The program will copy the file-inputed binary tree to another empty one!" << endl;
200 _Binary_Tree BT2;
201
202 cout << "The origin binary tree is as follow:" << endl;
203 cout << "The preorder traversal of sequence is" << endl;
204 BT1.PreOrderTraverse(BT1.getNodePoint());
205 cout << endl;
206 cout << "The middle order traversal of sequence is" << endl;
207 BT1.InOrderTraverse(BT1.getNodePoint());
208 cout << endl;
209 cout << "The post order traversal of sequence is" << endl;
210 BT1.PostOrderTraverse(BT1.getNodePoint());
211 cout << endl;
212 cout << "The level order traversal of sequence is" << endl;
213 BT1.levelOrderTraverse( BT1.getNodePoint() );
214 cout << endl;
215
216 cout << "The empty binary tree is as follow:" << endl;
217
218 cout << "The preorder traversal of sequence is" << endl;
219 BT2.PreOrderTraverse(BT2.getNodePoint());
220 cout << endl;
221 cout << "The middle order traversal of sequence is" << endl;
222 BT2.InOrderTraverse(BT2.getNodePoint());
223 cout << endl;
224 cout << "The post order traversal of sequence is" << endl;
225 BT2.PostOrderTraverse(BT2.getNodePoint());
226 cout << endl;
227 cout << "The level order traversal of sequence is" << endl;
228 BT2.levelOrderTraverse( BT2.getNodePoint() );
229 cout << endl;
230
231 cout << "The following for the copy of binary tree:" << endl;
232
233 BT1.copyBTree( BT2.getNodePoint(), BT1.getNodePoint() );
234
235 cout << "The preorder traversal of sequence is" << endl;
236 BT2.PreOrderTraverse(BT2.getNodePoint());
237 cout << endl;
238 cout << "The middle order traversal of sequence is" << endl;
239 BT2.InOrderTraverse(BT2.getNodePoint());
240 cout << endl;
241 cout << "The post order traversal of sequence is" << endl;
242 BT2.PostOrderTraverse(BT2.getNodePoint());
243 cout << endl;
244 cout << "The level order traversal of sequence is" << endl;
245 BT2.levelOrderTraverse( BT2.getNodePoint() );
246 cout << endl;
247
248 }
249
250 void test7()
251 {
252 _Binary_Tree BT1;
253 elementType strLine[100][3];
254 int nRow = 0, nLen = 0;
255 binTree index;
256 BT1.readFileToArray(strLine,nLen);
257 //BT1._Binary_Tree();
258
259 BT1.createBinaryTree( index,strLine, nLen, nRow);
260 cout << "The program will output the paths that each leaf node of the binary tree to the root node." << endl;
261
262 cout << "The origin binary tree is as follow:" << endl;
263 cout << "The preorder traversal of sequence is" << endl;
264 BT1.PreOrderTraverse(BT1.getNodePoint());
265 cout << endl;
266 cout << "The middle order traversal of sequence is" << endl;
267 BT1.InOrderTraverse(BT1.getNodePoint());
268 cout << endl;
269 cout << "The post order traversal of sequence is" << endl;
270 BT1.PostOrderTraverse(BT1.getNodePoint());
271 cout << endl;
272 cout << "The level order traversal of sequence is" << endl;
273 BT1.levelOrderTraverse( BT1.getNodePoint() );
274 cout << endl;
275
276 int pathLength = 0;
277 elementType *path = new char[ BT1.numberOfBTreeNode( BT1.getNodePoint() ) ];
278 BT1.allLeafToRootPath( BT1.getNodePoint(), path, pathLength );
279
280 }
281
282 void test8()
283 {
284 _Binary_Tree BT1;
285 elementType strLine[100][3];
286 int nRow = 0, nLen = 0;
287 binTree index;
288 BT1.readFileToArray(strLine,nLen);
289 //BT1._Binary_Tree();
290
291 BT1.createBinaryTree( index,strLine, nLen, nRow);
292 cout << "The program will ouput the level order traversal of the file-inputed binary tree." << endl;
293 cout << "The level order traversal of sequence is" << endl;
294 BT1.levelOrderTraverse( BT1.getNodePoint() );
295 cout << endl;
296 }
297
298 void test9()
299 {
300 _Binary_Tree BT1;
301 char strLine[100][3];
302 int nRow = 0, nLen = 0;
303 binTree index;
304 BT1.readFileToArray(strLine,nLen);
305 //BT1._Binary_Tree();
306
307 BT1.createBinaryTree( index,strLine, nLen, nRow);
308
309 cout << "Please input two character and the program will output their nearset ancestor." << endl;
310 elementType ch1, ch2;
311 while( cin >> ch1 >> ch2 )
312 {
313 //BT1.nearestAncestor( binTree BT, bitNode *BNode1, bitNode *BNode2 );
314 bitNode *index1 = BT1.getNodePoint( BT1.getNodePoint(), ch1 );
315
316 if(!index1)
317 {
318 cout << ch1 << " is not in the binary tree!" << endl;
319 }
320
321 bitNode *index2 = BT1.getNodePoint( BT1.getNodePoint(), ch2 );
322
323 if(!index2)
324 {
325 cout << ch2 << " is not in the binary tree!" << endl;
326 }
327
328 if( index1 && index2 )
329 {
330 bitNode *target = BT1.nearestAncestor( BT1.getNodePoint(), index1, index2 );
331 cout << "The nearset ancestor of " << ch1 << " and " << ch2 << " is " << target->data << endl;
332 }
333 cout << "Please input two character and the program will output their nearset ancestor." << endl;
334 }
335 }
336
337 void test10()
338 {
339 _Binary_Tree BT1;
340 char strLine[100][3];
341 int nRow = 0, nLen = 0;
342 binTree index;
343 BT1.readFileToArray(strLine,nLen);
344 //BT1._Binary_Tree();
345
346 BT1.createBinaryTree( index,strLine, nLen, nRow);
347 cout << "The program will output the longest path of the binary tree." << endl;
348 int pathLength = 0, longestLength = 0;
349 elementType *path1 = new char[ BT1.numberOfBTreeNode( BT1.getNodePoint() ) ];
350 elementType *longestPath = new char[ BT1.numberOfBTreeNode( BT1.getNodePoint() ) ];
351 BT1.binaryTreeLongestPath( BT1.getNodePoint(), path1, pathLength, longestPath, longestLength );
352 cout << "Longest path:" << endl;
353 for( int i = longestLength; i >= 0; i -- )
354 {
355 if( i!= 0 )
356 cout << longestPath[i] << " --> ";
357 else
358 cout << longestPath[i] << endl;
359
360 }
361 }
362
363 int main(int argc, char* argv[])
364 {
365 //test1();
366 test2();
367 //test3();
368 //test4();
369 //test5();
370 //test6();
371 //test7();
372 //test8();
373 //test9();
374 //test10();
375 return 0;
376 }
6.6 调试过程中出现的bug总结
往事不堪回首。
刚开始应该写成将data写成string或者直接将整个函数写成模板的,写完了最后测试时才发现现在的写法有诸多不便;但修改的话就又要重构一遍,懒得整了。
刚开始尝试写英文注释的,后面知难而退了;不过原来的英文注释我保留了。
附测试数据及对应二叉树图形:
bt4.btr
BinaryTree
A 0 1
B 0 1
C 0 1
D 0 0
bt8.btr
BinaryTree
1 1 1
2 1 1
3 1 1
4 0 0
5 0 0
6 0 1
7 0 0
8 0 0
bt9.btr
BinaryTree
a 1 1
b 1 1
d 0 0
e 1 1
g 0 0
h 0 0
c 1 0
f 0 1
i 0 0
bt10.btr
BinaryTree
A 1 1
B 1 1
C 0 0
D 1 0
E 0 0
F 1 1
G 0 1
H 0 0
I 1 0
J 0 0
bt12.btr
BinaryTree
A 1 1
B 1 1
C 0 0
D 1 1
E 0 0
F 0 0
G 1 1
H 1 1
I 0 0
J 1 0
K 0 0
L 0 0
bt14.btr
BinaryTree
A 1 0
B 1 1
C 1 1
D 0 1
E 0 0
F 1 0
G 0 1
H 0 0
I 1 0
J 1 1
K 0 0
L 1 0
M 1 0
N 0 0
bt15.btr
BinaryTree
A 1 1
B 1 1
D 1 0
G 0 0
E 1 1
H 0 0
I 0 0
C 0 1
F 1 1
J 1 1
L 0 0
M 0 1
N 1 0
O 0 0
K 0 0
bt21.btr
BinaryTree
a 1 1
b 1 1
c 1 1
d 1 1
e 0 0
f 0 0
g 0 0
h 1 1
i 0 0
j 0 0
k 1 1
l 1 1
m 0 0
n 0 0
o 1 1
p 0 1
q 0 0
r 1 1
s 0 0
t 1 0
u 0 0
bt261.btr
BinaryTree
a 1 1
b 1 1
c 1 1
d 1 1
e 0 0
f 0 0
g 1 0
h 0 0
i 1 1
j 0 1
k 0 0
l 1 0
m 0 0
n 1 1
o 1 1
p 1 1
q 0 0
r 0 0
s 0 0
t 1 1
u 1 1
v 0 0
w 0 0
x 1 1
y 0 0
z 0 0
bt262.btr
BinaryTree
a 1 1
b 1 1
c 1 1
d 0 1
e 1 1
f 0 1
g 0 0
h 1 1
i 0 0
j 0 0
k 1 1
l 0 0
m 0 0
n 1 1
o 0 0
p 0 0
q 1 1
r 0 1
s 1 1
t 0 0
u 0 0
v 1 1
w 0 1
x 0 0
y 0 1
z 0 0
full4.btr
BinaryTree
a 1 1
b 1 1
c 1 1
d 0 0
e 0 0
f 1 1
g 0 0
h 0 0
i 1 1
j 1 1
k 0 0
l 0 0
m 1 1
n 0 0
o 0 0
full5.btr
BinaryTree
a 1 1
b 1 1
c 1 1
d 1 1
e 0 0
f 0 0
g 1 1
h 0 0
i 0 0
j 1 1
k 1 1
l 0 0
m 0 0
n 1 1
o 0 0
p 0 0
q 1 1
r 1 1
s 1 1
t 0 0
u 0 0
v 1 1
w 0 0
x 0 0
y 1 1
z 1 1
1 0 0
2 0 0
3 1 1
4 0 0
5 0 0