1 数据结构的练习与巩固 2 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 3 #include <iostream> 4 using namespace std; 5 6 struct BTNode 7 { 8 char Data; 9 BTNode* lChild, * rChild; 10 BTNode() 11 { 12 lChild = NULL; 13 rChild = NULL; 14 } 15 BTNode(char& data, BTNode* l = NULL, BTNode* r = NULL) 16 { 17 Data = data; 18 lChild = l; 19 rChild = r; 20 } 21 }; 22 23 class BT 24 { 25 public: 26 BTNode* root; 27 char RefValue; 28 29 public: 30 BT() { root = NULL; } 31 BT(char value) 32 { RefValue = value, root = NULL; } 33 34 BTNode* lChild(BTNode* t) 35 { return(t != NULL) ? t->lChild : NULL; } 36 BTNode* rChild(BTNode* t) 37 { return(t != NULL) ? t->lChild : NULL; } 38 BTNode*& getRoot() 39 { return root; } 40 41 bool IsEmpty() 42 { return root == NULL; } 43 44 void preOrder(BTNode*& subTree) 45 { 46 if (subTree != NULL) 47 { 48 cout << subTree->Data << ' '; 49 preOrder(subTree->lChild); 50 preOrder(subTree->rChild); 51 } 52 } 53 void inOrder(BTNode*& subTree) 54 { 55 if (subTree != NULL) 56 { 57 inOrder(subTree->lChild); 58 cout << subTree->Data << ' '; 59 inOrder(subTree->rChild); 60 } 61 } 62 void postOrder(BTNode*& subTree) 63 { 64 if (subTree != NULL) 65 { 66 postOrder(subTree->lChild); 67 postOrder(subTree->rChild); 68 cout << subTree->Data << ' '; 69 } 70 } 71 72 void createBT(BTNode*& subTree) 73 { 74 char ch; 75 cin >> ch; 76 if (ch == RefValue)subTree = NULL; 77 else 78 { 79 subTree = new BTNode(ch); 80 createBT(subTree->lChild); 81 createBT(subTree->rChild); 82 } 83 } 84 85 void size(BTNode*& subTree, int& count) 86 { 87 if (subTree != NULL) 88 { 89 count++; 90 size(subTree->lChild, count); 91 size(subTree->rChild, count); 92 } 93 else 94 return; 95 } 96 97 void leaf(BTNode*& subTree, int& count) 98 { 99 if (subTree != NULL) 100 { 101 if (subTree->lChild == NULL && subTree->rChild == NULL) 102 { 103 count++; 104 return; 105 } 106 else 107 { 108 leaf(subTree->lChild, count); 109 leaf(subTree->rChild, count); 110 } 111 } 112 113 else return; 114 } 115 116 void IsBST(BTNode*& subTree, int& Flag) 117 { 118 if (subTree != NULL) 119 { 120 if (subTree->lChild == NULL && subTree->lChild == NULL) 121 { 122 return; 123 } 124 125 if (subTree->lChild == NULL) 126 { 127 if (subTree->rChild->Data < subTree->Data) Flag = 0; 128 IsBST(subTree->rChild, Flag); 129 } 130 131 if (subTree->rChild == NULL) 132 { 133 if (subTree->lChild->Data > subTree->Data) Flag = 0; 134 IsBST(subTree->lChild, Flag); 135 } 136 137 else 138 { 139 if (subTree->lChild->Data > subTree->Data) Flag = 0; 140 if (subTree->rChild->Data < subTree->Data) Flag = 0; 141 142 IsBST(subTree->lChild, Flag); 143 IsBST(subTree->rChild, Flag); 144 } 145 } 146 } 147 148 void height(BTNode*& subTree, char X, int& Height) 149 { 150 if (subTree != NULL) 151 { 152 if (subTree->Data == X) 153 { 154 return; 155 } 156 else if (subTree->Data > X) 157 { 158 Height++; 159 height(subTree->lChild, X, Height); 160 } 161 else if (subTree->Data < X) 162 { 163 Height++; 164 height(subTree->rChild, X, Height); 165 } 166 } 167 } 168 }; 169 170 int main() 171 { 172 int c1 = 0; 173 int c2 = 0; 174 int Height = 1; 175 int Flag = 1; 176 BT t('#'); 177 t.createBT(t.getRoot()); 178 179 cout << endl << "前序遍历" << endl; 180 t.preOrder(t.getRoot()); 181 cout << endl << "中序遍历" << endl; 182 t.inOrder(t.getRoot()); 183 cout << endl << "后序遍历" << endl; 184 t.postOrder(t.getRoot()); 185 186 t.size(t.getRoot(), c1); 187 cout << endl << "结点个数:" << c1 << endl; 188 t.leaf(t.getRoot(), c2); 189 cout << endl << "叶子个数:" << c2 << endl; 190 191 t.IsBST(t.getRoot(), Flag); 192 if (Flag) cout << "是排序树" << endl; 193 else cout << "非排序树" << endl; 194 195 char X; 196 cin >> X; 197 t.height(t.getRoot(), X, Height); 198 cout << endl << "当前高度:" << Height << endl; 199 }