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 }

 

posted @ 2020-08-19 00:48  世界を変える御宅族  阅读(175)  评论(0编辑  收藏  举报