算法导论 10.4.5 O(1)空间遍历二叉树

来源:互联网 发布:入骨相思知不知 编辑:程序博客网 时间:2024/05/19 03:20
#pragma once#include <new>#include <cstddef>#include <vector>#include <stack>//template<typename T>class binary_search_tree{public:using value_type = int;struct node{value_type value_;node* left_;node* right_;node* parent_;};void insert(std::initializer_list<value_type> il){for (auto&& v : il){this->insert(v);}}void insert(const value_type& v){node* ptr = head_;node* parent = nullptr;while (ptr != nullptr){parent = ptr;if (v < ptr->value_) ptr = ptr->left_;else ptr = ptr->right_;}auto new_node = get_new_node();if (head_ == nullptr) head_ = new_node;else if (v < parent->value_) parent->left_ = new_node;else parent->right_ = new_node;new (&new_node->value_) value_type(v);new_node->parent_ = parent;}std::vector<value_type> inoreder_walk() const{std::vector<value_type> res{};node* ptr = head_ ;bool counter = false;while (ptr){if (ptr->left_!= nullptr)ptr = ptr->left_;else{res.push_back(ptr->value_);while (!ptr->right_){bool isBreak = false;if (ptr->parent_ == nullptr) return std::move(res);while (ptr == ptr->parent_->right_){isBreak = true;ptr = ptr->parent_->parent_;if (ptr->parent_ == nullptr){if (counter) return std::move(res);counter = true;break;}}if (!isBreak)ptr = ptr->parent_;res.push_back(ptr->value_);}ptr = ptr->right_;}}return res;}void transplant(node* src, node* des){if (des == head_) head_ = src;if (src->parent_->left_ == des)src->parent_->left_ = des;else{src->parent_->right_ = des;}src->parent_ = des->parent_;}node* tree_mininum(node* n) const noexcept{node* ptr = n;node* res = nullptr;while (ptr != nullptr){res = ptr;ptr = ptr->left_;}return res;}void erase(node* nodeToDel){if (nodeToDel == nullptr) return ;if (nodeToDel->left_ == nullptr)transplant(nodeToDel->right_, nodeToDel);else if (nodeToDel->right_ == nullptr)transplant(nodeToDel->left_, nodeToDel);else{auto successor = tree_mininum(nodeToDel->right_);if (successor != nodeToDel->right_){transplant(successor->right_, successor);successor->right_ = nodeToDel->right_;successor->right_->parent_ = successor;}transplant(successor, nodeToDel);successor->left_ = nodeToDel->left_;successor->left_->parent_ = successor;}delete nodeToDel;}node* get_new_node() const{auto new_node =  static_cast<node*>(::operator new(sizeof(node)));new_node->left_ = new_node->right_ = new_node->parent_ = nullptr;return new_node;}private:node* head_ = nullptr;};

0 0
原创粉丝点击