中序线索化
class TreeNode{
public:
TreeNode * left,*right;
int ltag,rtag;
int data;
TreeNode(int data): left(nullptr),right(nullptr),ltag(0),rtag(0),data(_data){}
};
class process{
public:
TreeNode *pre = nullptr;
void creatTree(TreeNode * root){
if(root){
inTread(root);
if(pre -> right == nullptr){
pre -> rtag = 1;
}
}
}
void inTread(TreeNode *root){
if(!root){
return;
}
inTread(root -> left);
visit(root);
inTread(root -> right);
}
void visit(TreeNode *root){
if(root -> left == nullptr){
root -> left = pre;
root -> ltag = 1;
}
if(!pre && pre -> right == nullptr){
pre -> right = root;
pre -> rtag = 1;
}
pre = root;
}
}
遍历
TreeNode * firstNode(TreeNode * root){
if(root -> ltag == 0){
root = root -> left;
}
return root;
}
TreeNode * nextNode(TreeNode *root){
if(root -> rtag == 0){
return firstNode(root -> right);
}
return root -> right;
}
void Inorder(TreeNode *root){
while(TreeNode * p = firstNode(root); !p;p = nextNode(p)){
visit(p);
}
}
void visit(TreeNode * p){
printf("%d ",p->data);
}
逆向遍历
TreeNode * lastNode(TreeNode * root){
if(root -> rtag == 0){
root = root -> right;
}
return root;
}
TreeNode * preNode(TreeNode *root){
if(root -> ltag == 0){
return lastNode(root -> left);
}
return root -> left;
}
void Inorder(TreeNode *root){
while(TreeNode * p = lastNode(root); !p;p = preNode(p)){
visit(p);
}
}
void visit(TreeNode * p){
printf("%d ",p->data);
}
先序线索化
注意防止转圈
class TreeNode{
public:
TreeNode * left,*right;
int ltag,rtag;
int data;
TreeNode(int data): left(nullptr),right(nullptr),ltag(0),rtag(0),data(_data){}
};
class process{
public:
TreeNode *pre = nullptr;
void creatTree(TreeNode * root){
if(root){
inTread(root);
if(pre -> right == nullptr){
pre -> rtag = 1;
}
}
}
void inTread(TreeNode *root){
if(!root){
return;
}
visit(root);
if(root -> ltag == 0){
inTread(root -> left);
}
inTread(root -> right);
}
void visit(TreeNode *root){
if(root -> left == nullptr){
root -> left = pre;
root -> ltag = 1;
}
if(!pre && pre -> right == nullptr){
pre -> right = root;
pre -> rtag = 1;
}
pre = root;
}
}
遍历
void Inorder(TreeNode * root){
while(root){
visit(root);
if(root -> rtag == 1){
root = root -> right;
}else{
if(root -> ltag == 0){
root = root -> left;
}else{
root = root -> right;
}
}
}
}
void visit(TreeNode *root){
printf("%d ", root -> data);
}
先序线索化不能找到前驱节点
后序线索化
class TreeNode{
public:
TreeNode * left,*right;
int ltag,rtag;
int data;
TreeNode(int data): left(nullptr),right(nullptr),ltag(0),rtag(0),data(_data){}
};
class process{
public:
TreeNode *pre = nullptr;
void creatTree(TreeNode * root){
if(root){
inTread(root);
if(pre -> right == nullptr){
pre -> rtag = 1;
}
}
}
void inTread(TreeNode *root){
if(!root){
return;
}
inTread(root -> left);
inTread(root -> right);
visit(root);
}
void visit(TreeNode *root){
if(root -> left == nullptr){
root -> left = pre;
root -> ltag = 1;
}
if(!pre && pre -> right == nullptr){
pre -> right = root;
pre -> rtag = 1;
}
pre = root;
}
}
后序线索化不能找到后继节点
逆后续遍历
void inorder(TreeNode * root){
while(root){
visit(root);
if(root -> ltag = 1){
root = root -> left;
}else{
if(root -> rtag == 0){
root = root -> right;
}else{
root = root -> left;
}
}
}
}
void visit(TreeNode *root){
printf("%d ", root -> data);
}