当前位置:网站首页>Morris traverse
Morris traverse
2022-06-24 23:32:00 【Aujourd'hui, j'écrirai aussi des bogues,】
Les méthodes traditionnelles de traversée, qu'elles soient implémentées Récursivement ou en pile,La complexité spatiale de sa traversée estO(N),EtMorrisLa traversée peut être faite avec seulementO(1)La complexité spatiale de,Et sa complexité temporelle est aussiO(N).
Catalogue des articles
MorrisIntroduction à la traversée
MorrisLa traversée utilise un grand nombre de pointeurs libres dans l'arbre d'origine,Pour économiser de l'espace.
MorrisLa règle de traversée est:
Supposons que le noeud actuelcur,Au débutcurJusqu'à la position du noeud de tête
- SicurPas de gauche.,curÀ droite(cur=cur->right)
- SicurIl y a un enfant de gauche.,Trouver le noeud le plus à droite sur le Sous - arbre gauchemostRight
1).SimostRightLe pointeur droit de,Faites - le pointer verscur,Et puiscurÀ gauche(cur=cur->left)
2).SimostRightLe pointeur droit verscur,Faites - le pointer versnullptr,Et puiscurÀ droite(cur=cur->right) - curVide,Arrêter la traversée.
class Node
{
public:
Node(int _value)
{
value = _value;
left = nullptr;
right = nullptr;
}
int value;
Node* left;
Node* right;
};
void morris(Node* head)
{
if (head == nullptr)
{
return;
}
Node* cur = head;
//mostRightPourcur Le noeud le plus à droite de l'arbre de gauche
Node* mostRight = nullptr;
while (cur != nullptr)
{
mostRight = cur->left;
//SicurPas d'arbre gauche,Alorscur Va se déplacer directement à droite
if (mostRight != nullptr)
{
//Cherche.cur Le noeud le plus à droite de l'arbre de gauche , Quand vide ou égal à curArrêt
while (mostRight->right != nullptr && mostRight->right != cur)
{
mostRight = mostRight->right;
}
//Si vide, Description première fois au noeud le plus à droite , Pointez le pointeur vers cur
//Et puiscur Vers le Sous - arbre gauche
if (mostRight->right == nullptr)
{
mostRight->right = cur;
cur = cur->left;
continue;
}
//En ce momentmostRight->right == cur
// Description deuxième arrivée au noeud , Restaurer le pointeur pour ce noeud
else
{
mostRight->right = nullptr;
}
}
cur = cur->right;
}
}

MorrisTraversée préalable
L'ordre de traversée de l'ordre précédent est à gauche et à droite de la racine ,Parce queMorris .La traversée peut atteindre un noeud deux fois , Donc nous devons imprimer la première fois que nous atteignons le noeud .
void morrisPre(Node* head)
{
if (head == nullptr)
{
return;
}
Node* cur = head;
//mostRightPourcur Le noeud le plus à droite de l'arbre de gauche
Node* mostRight = nullptr;
while (cur != nullptr)
{
mostRight = cur->left;
//SicurPas d'arbre gauche,Alorscur Va se déplacer directement à droite
if (mostRight != nullptr)
{
//Cherche.cur Le noeud le plus à droite de l'arbre de gauche , Quand vide ou égal à curArrêt
while (mostRight->right != nullptr && mostRight->right != cur)
{
mostRight = mostRight->right;
}
//Si vide, Description première fois au noeud le plus à droite , Pointez le pointeur vers cur
//Et puiscur Vers le Sous - arbre gauche
if (mostRight->right == nullptr)
{
cout << cur->value << endl;
mostRight->right = cur;
cur = cur->left;
continue;
}
//En ce momentmostRight->right == cur
//DescriptionmostRight Deuxième arrivée au noeud , Restaurer le pointeur pour ce noeud
else
{
mostRight->right = nullptr;
}
}
//cur Il n'y a pas d'arbre gauche ,Impression directecur,Et bouge.cur Sur le Sous - arbre droit
else
{
cout << cur->value << endl;
}
cur = cur->right;
}
}
MorrisTraversée de l'ordre moyen
La traversée du milieu suit le principe de la racine gauche et de la droite ,Pour un noeud,Imprimer à la deuxième arrivée.
void morrisIn(Node* head)
{
if (head == nullptr)
{
return;
}
Node* cur = head;
//mostRightPourcur Le noeud le plus à droite de l'arbre de gauche
Node* mostRight = nullptr;
while (cur != nullptr)
{
mostRight = cur->left;
//SicurPas d'arbre gauche,Alorscur Va se déplacer directement à droite
if (mostRight != nullptr)
{
//Cherche.cur Le noeud le plus à droite de l'arbre de gauche , Quand vide ou égal à curArrêt
while (mostRight->right != nullptr && mostRight->right != cur)
{
mostRight = mostRight->right;
}
//Si vide, Description première fois au noeud le plus à droite , Pointez le pointeur vers cur
//Et puiscur Vers le Sous - arbre gauche
if (mostRight->right == nullptr)
{
mostRight->right = cur;
cur = cur->left;
continue;
}
//En ce momentmostRight->right == cur
//DescriptionmostRight Deuxième arrivée au noeud , Restaurer le pointeur pour ce noeud
else
{
mostRight->right = nullptr;
}
}
// Parce que la première fois mostRight->right = cur;
// Donc le Sous - arbre gauche cur Ce noeud peut être atteint deux fois , Imprimer la deuxième fois
cout << cur->value << endl;
cur = cur->right;
}
}
MorrisTraversée postérieure
La traversée postérieure est l'ordre des racines gauche et droite , Parce que nous n'avons pas de pointeur parent , Il n'est donc pas possible d'imprimer du sous - arbre droit au noeud racine . Sauf si vous utilisez la structure de la pile dans l'ordre inverse , Mais cela va à l'encontre de la complexité spatiale de O(1)L'intention initiale.
Donc,, On doit retourner la liste , Pointez le pointeur droit vers son noeud parent , Changez - le après l'impression .
//Retourner la liste des liens
Node* reverseEdge(Node* from)
{
Node* pre = nullptr;
Node* next = nullptr;
while (from != nullptr)
{
next = from->right;
from->right = pre;
pre = from;
from = next;
}
return pre;
}
void printEdge(Node* head)
{
// Considérez l'extrême droite du sous - arbre droit comme une liste liée
//Retournez la liste
Node* tail = reverseEdge(head);
Node* cur = tail;
while (cur != nullptr)
{
cout << cur->value << endl;
cur = cur->right;
}
// La liste est retournée
reverseEdge(tail);
}
void morrisPos(Node* head)
{
if (head == nullptr)
{
return;
}
Node* cur = head;
//mostRightPourcur Le noeud le plus à droite de l'arbre de gauche
Node* mostRight = nullptr;
while (cur != nullptr)
{
mostRight = cur->left;
//SicurPas d'arbre gauche,Alorscur Va se déplacer directement à droite
if (mostRight != nullptr)
{
//Cherche.cur Le noeud le plus à droite de l'arbre de gauche , Quand vide ou égal à curArrêt
while (mostRight->right != nullptr && mostRight->right != cur)
{
mostRight = mostRight->right;
}
//Si vide, Description première fois au noeud le plus à droite , Pointez le pointeur vers cur
//Et puiscur Vers le Sous - arbre gauche
if (mostRight->right == nullptr)
{
mostRight->right = cur;
cur = cur->left;
continue;
}
//En ce momentmostRight->right == cur
// Description deuxième arrivée au noeud , Restaurer le pointeur pour ce noeud
else
{
mostRight->right = nullptr;
// Imprimer la bordure droite du sous - arbre gauche d'un arbre dans l'ordre inverse
printEdge(cur->left);
}
}
cur = cur->right;
}
//Imprimer la limite droite de l'arbre entier dans l'ordre inverse
printEdge(head);
}
边栏推荐
- golang map clear
- R language uses the multinom function of NNET package to build an unordered multi classification logistic regression model, and uses exp function and coef function to obtain the corresponding odds rat
- Hydropower project construction scheme based on 3D GIS Development
- 379. hide and seek
- 7-3 maximum sub segment and
- Why is it that the "Zhongtai" that was originally eaten by civil engineering is no longer fragrant?
- js监听页面或元素scroll事件,滚动到底部或顶部
- [JS] - [array, Stack, queue, Link List basis] - Notes
- What good smart home brands in China support homekit?
- SimpleDateFormat 格式化和解析日期的具体类
猜你喜欢

SimpleDateFormat 格式化和解析日期的具体类

当初吃土建起来的“中台”,现在为啥不香了?

安装IBM CPLEX学术版 academic edition | conda 安装 CPLEX

【js】-【字符串-应用】- 学习笔记

Ningde times will increase RMB 45billion: Hillhouse subscribes RMB 3billion and Zeng Yuqun still controls 23% of the equity

Design and practice of vivo server monitoring architecture

Actipro WPF Controls 2022.1.2

Helix distance of point

点的螺旋距离

Huawei machine learning service speech recognition function enables applications to paint "sound" and color
随机推荐
Pseudo original intelligent rewriting API Baidu - good collection
Laravel creates a service layer
Still using simpledateformat for time formatting? Be careful of project collapse
Common regular expressions
sql -CONVERT函数
【js】-【數組、棧、隊列、鏈錶基礎】-筆記
Helix distance of point
2021-2022 China's financial digitalization "new" insight Industry Research Report
[JS] - [string - application] - learning notes
Installing IBM CPLEX academic edition | CONDA installing CPLEX
六大行数据治理现状盘点:治理架构、数据标准与数据中台(2022.04)
7-7 digital triangle
golang convert json string to map
7-6 铺设油井管道
数字IC设计经验整理(二)
golang map clear
Whereabouts computer desktop small arrow
Laravel scheduled task
还在用 SimpleDateFormat 做时间格式化?小心项目崩掉
372. chessboard coverage