CPPX 1.1.2
A Modern C++ Utility Library
Loading...
Searching...
No Matches
cppx.h
Go to the documentation of this file.
1#ifndef CPPX_H
2#define CPPX_H
3
4#include <iostream>
5#include <memory>
6#include <queue>
7#include <stack>
8#include <stdexcept>
9#include <vector>
10
11namespace stl_ext
12{
13
14template <typename T> class BST;
15
16template <typename T> class Node
17{
18
19 friend class BST<T>;
20
21 private:
22 T m_data;
23 std::unique_ptr<Node<T>> p_left;
24 std::unique_ptr<Node<T>> p_right;
25 int m_height = 1;
26
27 public:
28 explicit Node(T val) : m_data(val), p_left(nullptr), p_right(nullptr), m_height(1)
29 {
30 }
31 Node(T val, std::unique_ptr<Node<T>> left, std::unique_ptr<Node<T>> right)
32 : m_data(val), p_left(std::move(left)), p_right(std::move(right)), m_height(1)
33 {
34 }
35
36 Node(const Node &other);
37 Node &operator=(const Node &other);
38 Node(Node &&other) noexcept = default;
39 Node &operator=(Node &&other) noexcept = default;
40 int get_height_val() const;
41 void set_height_val(int h);
42 std::unique_ptr<Node<T>> detach_left();
43 std::unique_ptr<Node<T>> detach_right();
44 const T &get_data() const;
45 void set_data(const T &val);
46 Node<T> *get_left() const;
47 void set_left(std::unique_ptr<Node<T>> node);
48 Node<T> *get_right() const;
49 void set_right(std::unique_ptr<Node<T>> node);
50};
51
52template <typename T> class BinaryTree
53{
54 protected:
55 std::unique_ptr<Node<T>> p_head;
56 void preorder(const Node<T> *node) const;
57 void inorder(const Node<T> *node) const;
58 void postorder(const Node<T> *node) const;
59 void levelorder(const Node<T> *node) const;
60 int compute_size(const Node<T> *node) const;
61
62 public:
63 BinaryTree() : p_head(nullptr)
64 {
65 }
66 BinaryTree(const BinaryTree &other);
67 BinaryTree &operator=(const BinaryTree &other);
68 BinaryTree(BinaryTree &&other) noexcept = default;
69 BinaryTree &operator=(BinaryTree &&other) noexcept = default;
70 virtual ~BinaryTree() = default;
71
72 Node<T> *get_root() const;
73 void set_root(std::unique_ptr<Node<T>> root);
74 bool is_empty() const;
75 int size() const;
76 void print_preorder() const;
77 void print_inorder() const;
78 void print_postorder() const;
79 void print_levelorder() const;
80
81 static std::unique_ptr<Node<T>> make_node(const T &val);
82 static std::unique_ptr<Node<T>> make_node(const T &val, std::unique_ptr<Node<T>> left,
83 std::unique_ptr<Node<T>> right);
84 void set_left(Node<T> *parent, std::unique_ptr<Node<T>> left_child);
85 void set_right(Node<T> *parent, std::unique_ptr<Node<T>> right_child);
86};
87
88template <typename T> class BST : public BinaryTree<T>
89{
90 private:
91 void insert_iterative(Node<T> *node, const T &val);
92 std::unique_ptr<Node<T>> remove_impl(std::unique_ptr<Node<T>> node, const T &val);
93
94 public:
95 using BinaryTree<T>::p_head;
96 virtual void insert(const T &val);
97 bool contains(const T &val) const;
98 virtual void remove(const T &val);
99 T get_min() const;
100 T get_max() const;
101 T get_successor(const T &val) const;
102 T get_predecessor(const T &val) const;
103};
104
105template <typename T> class AVLTree : public BST<T>
106{
107
108 private:
109 int get_height(const Node<T> *node) const;
110 int get_balance_factor(const Node<T> *node) const;
111 void update_height(Node<T> *node);
112
113 std::unique_ptr<Node<T>> rotate_left(std::unique_ptr<Node<T>> node);
114 std::unique_ptr<Node<T>> rotate_right(std::unique_ptr<Node<T>> node);
115 std::unique_ptr<Node<T>> rebalance(std::unique_ptr<Node<T>> node);
116
117 std::unique_ptr<Node<T>> insert_helper(std::unique_ptr<Node<T>> node, const T &val);
118 std::unique_ptr<Node<T>> remove_helper(std::unique_ptr<Node<T>> node, const T &val);
119
120 public:
121 void insert(const T &val) override;
122 void remove(const T &val) override;
123};
124
125} // namespace stl_ext
126
127#include "../src/avl.tpp"
128#include "../src/binary_tree.tpp"
129#include "../src/bst.tpp"
130#include "../src/node.tpp"
131
132#endif
void remove(const T &val) override
Definition avl.tpp:122
void insert(const T &val) override
Definition avl.tpp:94
T get_predecessor(const T &val) const
Definition bst.tpp:164
virtual void insert(const T &val)
Definition bst.tpp:6
T get_max() const
Definition bst.tpp:118
T get_successor(const T &val) const
Definition bst.tpp:128
virtual void remove(const T &val)
Definition bst.tpp:103
T get_min() const
Definition bst.tpp:108
bool contains(const T &val) const
Definition bst.tpp:88
static std::unique_ptr< Node< T > > make_node(const T &val)
BinaryTree & operator=(BinaryTree &&other) noexcept=default
int compute_size(const Node< T > *node) const
void print_levelorder() const
void postorder(const Node< T > *node) const
void set_left(Node< T > *parent, std::unique_ptr< Node< T > > left_child)
virtual ~BinaryTree()=default
void print_preorder() const
BinaryTree(BinaryTree &&other) noexcept=default
void set_root(std::unique_ptr< Node< T > > root)
Node< T > * get_root() const
void inorder(const Node< T > *node) const
void preorder(const Node< T > *node) const
void print_inorder() const
void set_right(Node< T > *parent, std::unique_ptr< Node< T > > right_child)
bool is_empty() const
void levelorder(const Node< T > *node) const
BinaryTree & operator=(const BinaryTree &other)
void print_postorder() const
std::unique_ptr< Node< T > > p_head
Definition cppx.h:55
std::unique_ptr< Node< T > > detach_left()
Definition node.tpp:35
int get_height_val() const
Definition node.tpp:25
Node(T val)
Definition cppx.h:28
void set_left(std::unique_ptr< Node< T > > node)
Definition node.tpp:60
Node(Node &&other) noexcept=default
std::unique_ptr< Node< T > > detach_right()
Definition node.tpp:40
Node & operator=(const Node &other)
Definition node.tpp:12
const T & get_data() const
Definition node.tpp:45
Node< T > * get_right() const
Definition node.tpp:65
Node & operator=(Node &&other) noexcept=default
void set_right(std::unique_ptr< Node< T > > node)
Definition node.tpp:70
Node< T > * get_left() const
Definition node.tpp:55
Node(T val, std::unique_ptr< Node< T > > left, std::unique_ptr< Node< T > > right)
Definition cppx.h:31
void set_data(const T &val)
Definition node.tpp:50
void set_height_val(int h)
Definition node.tpp:30
Definition cppx.h:12