c++二叉树
1 #pragma once 2 template<class T>struct binaryNode { 3 binaryNode() = default; 4 binaryNode(T data, binaryNode<T>* father = NULL, binaryNode<T>* lson = NULL, binaryNode<T>* rson = NULL) : 5 father(father), lson(lson), rson(rson), data(data) {} 6 binaryNode<T>* father; 7 binaryNode<T>* lson; 8 binaryNode<T>* rson; 9 T data; 10 size_t height() { 11 size_t height = 1; 12 if (lson == NULL && rson == NULL); 13 else 14 height++; 15 return height; 16 } 17 size_t size() { 18 size_t sz = 1; 19 lson == NULL ? sz : sz++; 20 rson == NULL ? sz : sz++; 21 return sz; 22 }; 23 auto insertls(T data) { 24 return lson = new binaryNode<T>(data, this); 25 } 26 auto insertrs(T data) { 27 return rson = new binaryNode<T>(data, this); 28 } 29 auto remove() { 30 delete rson; 31 delete lson; 32 delete this; 33 } 34 bool operator<(const binaryNode<T>* node) { return node->data < data ? true : false; } 35 bool operator>(const binaryNode<T>* node) { return !(node < this); } 36 bool operator==(const binaryNode<T>* node) { return data == node->data; } 37 38 };
1 #include <iostream> 2 #include<queue> 3 #include<binaryTree.hpp> 4 #include<vector> 5 #include<cassert> 6 7 8 using namespace std; 9 10 template<class T>binaryNode<T>* getNode(T num) 11 { 12 return new binaryNode<T>(num); 13 14 }; 15 16 vector<size_t> getvec(size_t num) { 17 vector<size_t>s; 18 while (num > 1) { 19 s.push_back(num % 2); 20 num /= 2; 21 } 22 return s; 23 } 24 25 template<class T>class binaryTree { 26 public: 27 28 binaryNode<T>* top = nullptr, * curr; 29 30 binaryTree() = default; 31 32 binaryTree(T data, binaryNode<T>* node = new binaryNode<T>()) :top(node) 33 { 34 sz = 0; 35 curr = top; 36 sz++; 37 top->data = data; 38 que.push(top); 39 vec.push_back(0); 40 vec.push_back(top); 41 } 42 43 binaryNode<T>* operator[](size_t num) { 44 if (num == 1)return top; 45 else 46 { 47 return vec[num]; 48 } 49 50 51 } 52 53 size_t size() const { return sz; } 54 55 size_t height()const { 56 return hi; 57 } 58 59 void insertls(int num, T data) { insertls(num, new binaryNode<T>(data)); } 60 61 void insertrs(int num, T data) { insertrs(num, new binaryNode<T>(data)); } 62 63 void insertls(int num, binaryNode<T>* node) { 64 binaryNode<T>* get = this->operator[](num); 65 assert(get != nullptr); 66 if (get->rson == NULL)hi++; 67 sz += node->size(); 68 get->lson = node; 69 vec.push_back(get->lson); 70 } 71 72 void insertrs(int num, binaryNode<T>*node) { 73 binaryNode<T>* get = this->operator[](num); 74 assert(get != nullptr); 75 if (get->lson == NULL)hi++; 76 sz += node->size(); 77 get->rson = node; 78 vec.push_back(get->rson); 79 } 80 81 82 void insertaslstree(int num, const binaryTree<T>& tree) { 83 sz += tree.size() - tree.top->size(); 84 insertls(num, tree.top); 85 hi--; 86 hi += tree.height(); 87 } 88 89 void insertasrstree(int num, const binaryTree<T>& tree) { 90 sz += tree.size() - tree.top->size(); 91 92 insertrs(num, tree.top); 93 hi--; 94 hi += tree.height(); 95 } 96 auto root() { return top; } 97 98 void preorder_traverse(binaryNode<T>*node) { 99 if (!node)return; 100 cout << node->data<<" "; 101 preorder_traverse(node->lson); 102 preorder_traverse(node->rson); 103 } 104 105 void inorder_traverse(binaryNode<T>* node) { 106 if (!node)return; 107 inorder_traverse(node->lson); 108 cout << node->data << " "; 109 inorder_traverse(node->rson); 110 } 111 112 void postorder_traverse(binaryNode<T>* node) { 113 if (!node)return; 114 postorder_traverse(node->lson); 115 postorder_traverse(node->rson); 116 cout << node->data << " "; 117 } 118 119 void remove(int num) { 120 binaryNode<T>* get = this->operator[](num); 121 binaryNode<T>* father = this->operator[](num / 2); 122 if (get->lson || get->rson) 123 { 124 cout << "不允许remove" << endl; 125 } 126 else { 127 if (father->lson && father->rson); 128 else hi--; 129 sz--; 130 get->remove(); 131 } 132 } 133 134 bool empty() { return top == nullptr ? true : false; } 135 136 void traverse_level() { 137 if (!que.empty()) { 138 binaryNode<T>* node = que.front(); 139 cout << que.front()->data<<" "; 140 que.pop(); 141 if (!node) 142 return; 143 if (node->lson) 144 que.push(node->lson); 145 if (node->rson) 146 que.push(node->rson); 147 traverse_level(); 148 } 149 } 150 151 152 private: 153 size_t sz; 154 size_t hi = top->height(); 155 queue<binaryNode<T>*>que; 156 vector<binaryNode<T>*>vec; 157 158 }; 159 int main() { 160 161 binaryTree<char>s('i'); 162 s.insertls(1, getNode('d')); 163 s.insertls(2, getNode('c')); 164 s.insertls(3, getNode('a')); 165 s.insertrs(4, getNode('b')); 166 s.insertrs(2, getNode('h')); 167 s.insertls(6, getNode('f')); 168 s.insertls(7, getNode('e')); 169 s.insertrs(7, getNode('g')); 170 s.insertrs(1, getNode('l')); 171 s.insertls(10, getNode('k')); 172 s.insertrs(10, getNode('n')); 173 s.insertls(11, getNode('j')); 174 s.insertls(12, getNode('m')); 175 s.insertrs(12, getNode('p')); 176 s.insertrs(15, getNode('o')); 177 /*s.insertls(4, getNode('a')); 178 s.insertrs(8, getNode('b')); 179 s.insertls(5, getNode('f')); 180 s.insertls(10, getNode('e')); 181 s.insertrs(10, getNode('g')); 182 s.insertls(3, getNode('k')); 183 s.insertls(6, getNode('j')); 184 s.insertrs(3, getNode('n')); 185 s.insertrs(7, getNode('p')); 186 s.insertls(7, getNode('m')); 187 s.insertls(15, getNode('o'));*/ 188 //cout << s.size(); 189 //cout << s[18]->data; 190 //cout << "size:" << s.size(); 191 //s.traverse_level(); 192 s.preorder_traverse(s.top); 193 cout << s.size(); 194 }
所望隔山海