#include <limits>
struct node {
int data { std::numeric_limits<int>::max() };
bool ltag { false };
bool rtag { false };
struct node * left { nullptr };
struct node * right { nullptr };
};
void aux(node *cur, node *pre) {
if(cur && !cur->left) {
cur->ltag = true;
cur->left = pre;
}
if(pre && !pre->right) {
pre->rtag = true;
pre->right = cur;
}
}
void infix_threaded(node *cur, node **pre) {
if(!cur) return;
infix_threaded(cur->left, pre);
aux(cur, *pre);
*pre = cur;
infix_threaded(cur->right, pre);
}
void infix_threaded(node *root) {
if(!root) return;
node *pre { nullptr };
infix_threaded(root, &pre);
pre->rtag = true;
pre->right = nullptr;
}
node *first(node *o) {
while(!o->ltag) o = o->left;
return o;
}
node *next(node *o) {
return !o->rtag ? first(o->right) : o->right;
}
void infix_traversal(node *root, void (*f)(int)) {
if(!root) return;
for(node *p { first(root) }; p; p = next(p))
f(p->data);
}
【二叉树的中序线索化】
本文介绍了如何使用C++构建一个结构体表示节点的线性双向链表,并实现了递归的前序遍历算法,包括辅助函数aux和infix_threaded,以及用于遍历的infix_traversal方法。
摘要由CSDN通过智能技术生成