數據結構實驗6:C++實現二叉樹類


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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM