學習算法 仍是建議看看算法導論node
算法導論第三版 若是不看數學推導 僅看僞代碼 難度仍是適中ios
本系列只是記錄個人學習心得 和僞代碼轉化代碼的過程算法
深刻學習 仍是建議你們看看算法書籍 教程更加系統。函數
本文參考算法導論第12章節 二叉樹學習
代碼由本人寫成spa
轉載請標明出處指針
首先blog
因爲紅黑樹的刪除用到了二叉樹的一些函數 因此咱們從二叉樹講起教程
二叉樹 不帶顏色的紅黑樹 看看兩張畫的有點醜的圖數學
如圖
一個節點 記錄一個數值 同時還有兩個指向該節點兩個兒子的標識
兒子有兩個 左兒子和右兒子
圖中就有兩個二叉樹示例
一個僅有右兒子 一個左右兒子均有
C語言中或者C++語言中咱們這樣定義二叉樹結構
struct node { std::shared_ptr<node> left_; //智能指針 std::shared_ptr<node> right_; int value_; node() { left_ = right_ = nullptr; value_ = -1; } };
那麼遍歷樹中的元素而後打印的代碼以下
void PrintTree(const std::shared_ptr<node>& root) { if (root == nullptr) return; std::cout << root->value_ << " "; PrintTree(root->left_); PrintTree(root->right_); }
咱們如今建立一個圖中TREE2並把它的元素數值依次打印出來
// 122.cpp : 定義控制檯應用程序的入口點。 // #include "stdafx.h" #include <memory> #include <iostream> struct node { std::shared_ptr<node> left_; std::shared_ptr<node> right_; int value_; node() { left_ = right_ = nullptr; value_ = -1; } }; void PrintTree(const std::shared_ptr<node>& root) { if (root == nullptr) return; std::cout << root->value_ << " "; PrintTree(root->left_); PrintTree(root->right_); } int main() { std::shared_ptr<node> root(new node); root->value_ = 2; std::shared_ptr<node> x(new node); x->value_ = 1; root->left_ = x; std::shared_ptr<node> y(new node); y->value_ = 3; root->right_ = y; PrintTree(root); std::cout << std::endl; return 0; }
打印結果如圖:
樹的最大值和最小值
若是咱們規定
節點的左兒子及左兒子的兒子(子孫)都比該節點小
節點的右兒子及右兒子的兒子(子孫)都比該節點小
那麼獲取該二叉樹的最大最小值就很簡單了
沿左兒子一直向下 獲取最小值
沿右兒子一直向下 獲取最大值
std::shared_ptr<node> TreeMinimum(std::shared_ptr<node> n) { while (n->left_ != nullptr) { n = n->left_; } return n; } std::shared_ptr<node> TreeMaximum(std::shared_ptr<node> n) { while (n->right_ != nullptr) { n = n->right_; } return n; }
// 122.cpp : 定義控制檯應用程序的入口點。 // #include "stdafx.h" #include <memory> #include <iostream> struct node { std::shared_ptr<node> left_; std::shared_ptr<node> right_; int value_; node() { left_ = right_ = nullptr; value_ = -1; } }; void PrintTree(const std::shared_ptr<node>& root) { if (root == nullptr) return; std::cout << root->value_ << " "; PrintTree(root->left_); PrintTree(root->right_); } std::shared_ptr<node> TreeMinimum(std::shared_ptr<node> n) { while (n->left_ != nullptr) { n = n->left_; } return n; } std::shared_ptr<node> TreeMaximum(std::shared_ptr<node> n) { while (n->right_ != nullptr) { n = n->right_; } return n; } int main() { std::shared_ptr<node> root(new node); root->value_ = 15; std::shared_ptr<node> x = root; std::shared_ptr<node> n(new node); n->value_ = 10; x->left_ = n; x = n; n.reset(new node); n->value_ = 2; x->left_ = n; n.reset(new node); n->value_ = 12; x->right_ = n; x = root; n.reset(new node); n->value_ = 17; x->right_ = n; x = n; n.reset(new node); n->value_ = 16; x->left_ = n; n.reset(new node); n->value_ = 18; x->right_ = n; PrintTree(root); std::cout << std::endl; std::cout << "min:" << TreeMinimum(root)->value_ << std::endl; std::cout << "max:" << TreeMaximum(root)->value_ << std::endl; return 0; }
後繼和前驅
講了這麼多 就是爲了講後繼和前驅 二叉樹和紅黑樹的刪除用到了這個
該代碼在後繼紅黑樹章節中給出