數據結構筆記——線索二叉樹找前驅/後繼

目錄

一、中序線索二叉樹找中序後繼

二、中序線索二叉樹中找中序前驅

三、先序線索二叉樹找先序後繼

四、先序線索二叉樹找先序前驅

五、後序線索二叉樹找後序前驅

六、後序線索二叉樹找後序後繼

七、總結

一、中序線索二叉樹找中序後繼

在中序線索二叉樹中找到指定結點*p的中序後繼next

①若p->rtag == 1,則next = p->rchild

②若p->rtag == 0

//找到以P爲跟的子樹中,第一個被中序遍歷的結點
ThreadNode *Firstnode(ThreadNode *p){
    //循環找到最左下結點(不一定是葉子結點)
    while(p->ltag == 0)
        p = p->lchild;
    return p;
}

//在中序線索二叉樹中找到結點p的後繼結點
ThreadNode *Nextnode(ThreadNode *p){
    //右子樹中最左下結點
    if(p->rtag == 0)
        return Firstnode(p->rchild);
    else
        return p->rchild;
}

//對中序線索二叉樹進行中序遍歷(利用線索實現的非遞歸算法)  空間複雜度O(1)
void Inorder(ThreadNode *T){
    for(ThreadNode *p = Firstnode(T);p != NULL; p = Nextnode(p))
        visit(p);
}

二、中序線索二叉樹中找中序前驅

在中序線索二叉樹中找到指定結點*p的中序前驅pre

①若p->ltag == 1,則pre = p->lchild

②若p->ltag == 0

//找到以P爲跟的子樹中,最後一個被中序遍歷的結點
ThreadNode *Lastnode(ThreadNode *p){
    //循環找到最右下結點(不一定是葉子結點)
    while(p->rtag == 0)
        p = p->rchild;
    return p;
}

//在中序線索二叉樹中找到結點p的前驅結點
ThreadNode *Prenode(ThreadNode *p){
    //左子樹中最右下結點
    if(p->ltag == 0)
        return Lastnode(p->lchild);
    else
        return p->lchild;
}

//對中序線索二叉樹進行中序遍歷(利用線索實現的非遞歸算法)  空間複雜度O(1)
void RevInorder(ThreadNode *T){
    for(ThreadNode *p = Lastnode(T);p != NULL; p = Prenode(p))
        visit(p);
}

三、先序線索二叉樹找先序後繼

在先序線索二叉樹中找到指定結點*p的先序後繼next

①若p->rtag == 1,則next = p->rchild

②若p->rtag == 0

四、先序線索二叉樹找先序前驅

在先序線索二叉樹中找到指定結點*p的先序前驅pre

①若p->ltag == 1,則next = p->lchild

② 若p->ltag = 0

前提:改用三叉鏈表可以找到父節點

①如果能找到p的父節點,且p是左孩子

②如果能找到p的父節點,且p是右孩子,其左兄弟爲空

③如果能找到p的父節點,且p是右孩子,其左兄弟非空

④如果p是根結點,則p沒有先序前驅

五、後序線索二叉樹找後序前驅

在後序線索二叉樹中找到指定結點*p的後序前驅pre

①若p->ltag == 1,則pre = p->lchild

②若p->ltag == 0

六、後序線索二叉樹找後序後繼

在後序線索二叉樹中找到指定結點*p的後序後繼next

①若p->rtag == 1,則next = p->rchild

②若p->rtag == 0

前提:改用三叉鏈表可以找到父節點

①如果能找到p的父節點,且p是右孩子

②如果能找到p的父節點,且p是左孩子,且右兄弟爲空

③如果能找到p的父節點,且p是左孩子,且右兄弟非空

④如果p是根節點,則p沒有後序後繼

七、總結

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章