實驗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 #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