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<string>
  3 #include<binaryTree.hpp>
  4 #include<vector>
  5 #include<cassert>
  6 using namespace std;
  7 
  8 template<class T>binaryNode<T>* getNode(T num)
  9 {
 10     return new binaryNode<T>(num);
 11 
 12 };
 13 
 14 vector<size_t> getvec(size_t num) {
 15     vector<size_t>s;
 16     while (num > 1) {
 17         s.push_back(num % 2);
 18         num /= 2;
 19     }
 20     return s;
 21 }
 22 
 23 template<class T>class binaryTree {
 24 public:
 25 
 26     binaryNode<T>* top = nullptr, * curr;
 27 
 28     binaryTree() = default;
 29 
 30     binaryTree(T data, binaryNode<T>* node = new binaryNode<T>()) :top(node)
 31         //binaryTree()
 32     {
 33         sz = 0;
 34         curr = top;
 35         sz++;
 36         top->data = data;
 37     }
 38 
 39     binaryNode<T>* operator[](size_t num) {
 40         if (num == 1)return top;
 41         vector<size_t>s = getvec(num);
 42         binaryNode<T>* cp = curr;
 43         for (int i = static_cast<int>(s.size() - 1); i >= 0; --i) {
 44             if (s[i] && cp->rson)
 45                 cp = cp->rson;
 46             else if (!s[i] && cp->lson)
 47                 cp = cp->lson;
 48             else return nullptr;
 49         }
 50         return cp;
 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     }
 70 
 71     void insertrs(int num, binaryNode<T>*node) {
 72         binaryNode<T>* get = this->operator[](num);
 73         assert(get != nullptr);
 74         if (get->lson == NULL)hi++;
 75         sz += node->size();
 76         get->rson = node;
 77     }
 78 
 79 
 80     void insertaslstree(int num, const binaryTree<T>& tree) {
 81         sz += tree.size() - tree.top->size();
 82         insertls(num, tree.top);
 83         hi--;
 84         hi += tree.height();
 85     }
 86 
 87     void insertasrstree(int num, const binaryTree<T>& tree) {
 88         sz += tree.size() - tree.top->size();
 89 
 90         insertrs(num, tree.top);
 91         hi--;
 92         hi += tree.height();
 93     }
 94     auto root() { return top; }
 95 
 96     void preorder_traverse(binaryNode<T>*node) {
 97         if (!node)return;
 98         cout << node->data<<" ";
 99         preorder_traverse(node->lson);
100         preorder_traverse(node->rson);
101     }
102 
103     void inorder_traverse(binaryNode<T>* node) {
104         if (!node)return;
105         inorder_traverse(node->lson);
106         cout << node->data << " ";
107         inorder_traverse(node->rson);
108     }
109 
110     void postorder_traverse(binaryNode<T>* node) {
111         if (!node)return;
112         postorder_traverse(node->lson);
113         postorder_traverse(node->rson);
114         cout << node->data << " ";
115     }
116 
117     void remove(int num) {
118         binaryNode<T>* get = this->operator[](num);
119         binaryNode<T>* father = this->operator[](num / 2);
120         if (get->lson || get->rson)
121         {
122             cout << "不允许remove" << endl;
123         }
124         else {
125             if (father->lson && father->rson);
126             else hi--;
127             sz--;
128             get->remove();
129         }
130     }
131 
132     bool empty() { return top == nullptr ? true : false; }
133 
134 
135 
136 private:
137     size_t sz;
138     size_t hi = top->height();
139 };
140 int main() {
141     binaryTree<char>s('i');
142     s.insertls(1, getNode('d'));
143     s.insertrs(1, getNode('l'));
144     s.insertls(2, getNode('c'));
145     s.insertrs(2, getNode('h'));
146     s.insertls(4, getNode('a'));
147     s.insertrs(8, getNode('b'));
148     s.insertls(5, getNode('f'));
149     s.insertls(10, getNode('e'));
150     s.insertrs(10, getNode('g'));
151     s.insertls(3, getNode('k'));
152     s.insertls(6, getNode('j'));
153     s.insertrs(3, getNode('n'));
154     s.insertrs(7, getNode('p'));
155     s.insertls(7, getNode('m'));
156     s.insertls(15, getNode('o'));
157     //cout << s.size();
158     //cout << s[18]->data;
159     //cout << "size:" << s.size();
160     s.inorder_traverse(s.top);
161 }
原文地址:https://www.cnblogs.com/otakus/p/13527000.html