中序线索二叉树的前驱后继节点

代码实现:

#include
using namespace std;
//中序线索二叉树的前驱后继节点

struct TreeNode{

    char data; //数据
    TreeNode *left,*right; //指向左、右孩子的指针
    int ltag=0,rtag=0; //左、右线索标志,为0是表示指向左、右孩子,为1时表示指向前驱、后继,都初始化为0
};

TreeNode *final,*pre=NULL; //存储答案  前驱节点



//中序遍历建立线索二叉树
void inBuild(TreeNode *T){ //中序遍历

    if(T==NULL)
        return;

    inBuild(T->left); //递归左子树

    //左子树为空的时候,建立前驱线索
    if(T->left==NULL){
        T->left=pre;
        T->ltag=1;
    }

    //前驱节点不为空并且前驱节点的右子树为空的时候,建立前驱节点的后继线索
    if(pre!=NULL&&pre->right==NULL){
        pre->right=T;
        pre->rtag=1;
    }

    pre=T; //前驱节点后移


    inBuild(T->right); //递归右子树
}

//以当前节点为根节点中序遍历的第一个节点
TreeNode *firstNode(TreeNode *T){

    while(T->ltag==0) T=T->left;
    return T;
}

//求当前节点的后继节点
TreeNode *NextNode(TreeNode *T){

    if(T->rtag==1) return T->right;
    return firstNode(T->right);

}

//以当前节点为根节点中序遍历的最后一个节点
TreeNode *lastNode(TreeNode *T){

    while(T->rtag==0) T=T->right;
    return T;
}

//求当前节点的前驱节点
TreeNode *PreNode(TreeNode *T){

    if(T->ltag==1) return T->left;
    return lastNode(T->left);

}

int main(){

    TreeNode *a,*b,*c,*d,*e,*f,*g;

    a=new TreeNode;  //创建一棵静态二叉树
    b=new TreeNode;
    c=new TreeNode;
    d=new TreeNode;
    e=new TreeNode;
    f=new TreeNode;
    g=new TreeNode;

    a->left=b; a->right=c; a->data='A';
    b->left=d; b->right=e; b->data='B';
    c->left=f; c->right=NULL; c->data='C';
    d->left=NULL; d->right=g; d->data='D';
    e->left=NULL; e->right=NULL; e->data='E';
    f->left=NULL; f->right=NULL; f->data='F';
    g->left=NULL; g->right=NULL; d->data='G';


    inBuild(a); //中序遍历建立线索二叉树
    pre->right=NULL; //处理最后一个节点
    pre->rtag=1;

    //节点e的后继节点
    TreeNode *T=NextNode(e);
    cout<<"e的后继节点为:"<<T->data<<endl;

    //节点a的前驱节点
    T=PreNode(a);
    cout<<"a的前驱节点为:"<<T->data<<endl;

    return 0;
}

运行结果:

中序线索二叉树的前驱后继节点_第1张图片

你可能感兴趣的:(二叉树,数据结构,算法)