• 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 }
  • 相关阅读:
    11.13 同步异步协程
    GIL及进程池
    线程
    守护进程-互斥锁-IPC
    进程
    网络编程
    异常的处理
    面向对象编程2
    第一章 python学习,个人对计算机硬件的一些理解
    ActiveReports之直接打印报表
  • 原文地址:https://www.cnblogs.com/otakus/p/13527000.html
Copyright © 2020-2023  润新知