实验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 运行结果截图及说明
(后面有空上图)
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 #include <stdc++.h> 14 #include <windows.h> 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
原文地址:https://www.cnblogs.com/25th-engineer/p/9986473.html