当前位置:网站首页>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);
}
边栏推荐
- [JS] - [stack, team - application] - learning notes
- 7-2 后序+中序序列构造二叉树
- 7-8 循环日程安排问题
- idea创建模块提示已存在
- Binary lookup array subscript
- 常用正则表达式
- R language uses GLM function to build Poisson log linear regression model, processes three-dimensional contingency table data to build saturation model, uses summary function to obtain model summary s
- 378. 骑士放置
- [JS] - [array, Stack, queue, Link List basis] - Notes
- What you must know about time series database!
猜你喜欢

Ganglia 的安装与部署

基于三维GIS开发的水电工程建设方案

Yyds dry goods counting uses xshell to implement agent function

华为机器学习服务语音识别功能,让应用绘“声”绘色

idea创建模块提示已存在

第六章 网络学习相关技巧5(超参数验证)

2021-2022中国金融数字化“新”洞察行业研究报告

js监听页面或元素scroll事件,滚动到底部或顶部

Detailed explanation of online group chat and dating platform project (servlet implementation)

斐波那契
随机推荐
throttle-debounce.js:一个小型的防抖节流函数库
7-2 construction of binary tree by post order + middle order sequence
7-9 寻宝路线
【js】-【数组、栈、队列、链表基础】-笔记
当初吃土建起来的“中台”,现在为啥不香了?
如何化解35岁危机?华为云数据库首席架构师20年技术经验分享
[JS] - [array, Stack, queue, Link List basis] - Notes
Use of laravel verifier
第六章 网络学习相关技巧5(超参数验证)
[JS] - [linked list - application] - learning notes
Continuous soul torture from two MySQL indexes of interviewers
R语言使用glm函数构建泊松对数线性回归模型处理三维列联表数据构建饱和模型、使用summary函数获取模型汇总统计信息、解读模型系数交互作用及其显著性
7-8 循环日程安排问题
Common regular expressions
7-2 后序+中序序列构造二叉树
[introduction to UVM== > episode_8] ~ sequence and sequencer, sequence hierarchy
Websocket long link pressure test
Adding, deleting, querying and modifying MySQL tables
HarmonyOS访问数据库实例(3)--用ORM Bee测下HarmonyOS到底有多牛
websocket长链接压测